1. 程式人生 > >(十一)泛型、反射和異常

(十一)泛型、反射和異常

lang 異常處理 red 系統 變量 all 不存在 意思 ron

JavaSE(十一)

--泛型、反射和異常

一、泛型

泛型是javaSE1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數,這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。

javaSE1.5之前,沒有泛型的情況下,通過對類型Object的引用來實現參數的”任意化”,”任意化”帶來的缺點是要做顯示的強制類型轉換,而用這種轉換的要求是要求開發者對實際參數可以預知的情況下進行的。對於強制類型轉換錯誤的情況,編譯器可能不提示錯誤,在運行的時候才出現異常,這是一個安全隱患。

泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動的和隱式的,提高代碼的重用率。

這段話的意思是,javaSE1.5之前,假設我們在集合中存入了一個Object對象,這個Object對象我們知道是什麽類型的,但是編譯器不知道,所以取出來的時候還得強轉,而且我們只有在知道這個對象類型的時候才能強轉,否則看起來沒錯,運行時候還會拋異常呢。

二、反射

一個對象可以通過object.getClass()獲得它運行時的類.

可以getName獲得類名..

可以再getDeclaredMethods()獲取這個類的所有能訪問到的方法,獲取到方法之後可以遍歷,通過getName獲取方法名,getModifiers()獲取方法修飾符...

也可以getGenericInterfaces獲取該類所有的接口。

可以getFields獲取所有的能訪問到的成員變量,再遍歷中getName獲取變量名,getModifiers()獲取變量修飾符...

更多方法參考java.lang.reflect的幫助文檔

三、異常

1.簡介: 當程序出現無法控制的外部環境問題(用戶提供的文件不存在,文件內容損壞)時,java就會用異常對象來描述.

2.分類:

①檢查性異常(java.lang.Exception)

程序正確,但因為外在的環境條件不滿足,所以引發檢查性異常。Java編譯器強制要求處理這類異常,如果不捕獲這類異常,程序將不能被編譯。

例如FileReader fileReader=new FileReader(new File("D:\666.txt"));,馬上系統會提示你有一個異常未處理,因為你找文件,它可能找不到啊,如果找不到怎麽辦?這是一個異常,所以需要你馬上處理。

②運行時異常(java.lang.RuntimeException)

這意味著程序存在bug,例如數組越界、0被除、入參不滿足規範...這類異常需要更改程序來避免,java編譯器強制要求處理這類異常。

③錯誤(java.lang.Error)

一般很少見,也很難通過程序解決,它可能源於程序的bug,但一般更可能源於環境問題,如內存耗盡,錯誤在程序中無需處理,而由運行環境處理。

頂層是java.lang.Throwable類,檢查性異常、運行時異常、錯誤都是這個類的子孫類(ExceptionError繼承自Throwable,而RuntimeException繼承自Exception)

3.處理方式: java用兩種方法來處理異常,①在發生異常的地方直接處理②將異常拋給調用者,讓調用者處理.

try {

可能發生異常的操作A;

} catch (異常種類1 e) {

該異常處理。//一般e.printStackTrace();

}catch (異常種類2 e) {

該異常處理。//一般e.printStackTrace();

}

一般還會在最後加一個finally,如果把finally塊至於try...catch...語句後,finally塊一般都會得到執行(不管發沒發生異常),它相當於一個萬能的保險,即使前面的try塊發生異常,而又沒有對應異常的catch塊,finally塊將馬上執行,一般我們在finally中實現對資源、流的關閉。

以下情況,finally塊將不會被執行:

finally塊中發生了異常;

②程序所在線程死亡;

③前面的代碼中使用了System.exit();

④關閉cpu

Throw Exception,函數A 拋出一個異常,表面我這個函數不想管這個異常,到時候誰調用函數A誰再管這個異常。

4.異常的作用

當程序執行到某一塊有錯的時候,發生了異常,我們並不想讓程序就此停住,因為有可能這個異常根本不影響後面代碼的執行,所以我們處理異常並讓程序繼續執行。

(十一)泛型、反射和異常