第三部分. Java 的異常處理

一. Java 中異常分爲哪些種類

1. Java異常體系結構

java中的Exception類的子類不僅僅只是像上圖所示只包含IOException和RuntimeException這兩大類,事實上Exception的子類很多很多,主要可概括爲:運行時異常與非運行時異常。
2. 運行時異常與非運行時異常區別
運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度儘可能避免這類異常的發生。
非運行時異常,即編譯時異常(也叫強制性異常)也叫 CheckedException,都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
對 Checked 異常處理方法有兩種:
1.當前方法知道如何處理該異常,則用 try...catch 塊來處理該異常。
2.當前方法不知道如何處理,則在定義該方法是聲明拋出該異常。


二. Try …catch…finally結構運行順序 

1.	public int getNum(){
2.	try {
3.		int a = 1/0;
4.		return 1;
5.	} catch (Exception e) {
6.		return 2;
7.	}finally{
8.		return 3;
9.	}

代碼在走到第 3 行的時候遇到了一個 MathException,這時第四行的代碼就不會執行了,代碼直接跳轉到 catch 語句中,走到第 6 行的時候,異常機制有這麼一個原則如果在 catch 中遇到了 return 或者異常等能使該函數終止的話 那麼有 finally 就必須先執行完 finally 代碼塊裏面的代碼然後再返回值。因此代碼又跳到第 8 行,可惜第 8 行是一個 return 語句,那麼這個時候方法就結束了,因此第 6 行的返回結果就無法被真正返回。如果 finally 僅僅是處理了一個 釋放資源的操作,那麼該道題最終返回的結果就是 2。因此上面返回值是 3。
try、catch、finally三個語句塊應注意的問題:
第一:try、catch、finally三個語句塊均不能單獨使用,三者可以組成 try…catch…finally、try…catch、try…finally三種結構,catch語句可以有一個或多個,finally語句最多一個。
第二:try、catch、finally三個代碼塊中變量的作用域爲代碼塊內部,分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。
第三:多個catch塊時候,最多隻會匹配其中一個異常類且只會執行該catch塊代碼,而不會再執行其它的catch塊,且匹配catch語句的順序爲從上到下,也可能所有的catch都沒執行。
第四:先Catch子類異常再Catch父類異常。
如下圖所示:


三. error 和 exception 的區別

Error 類和 Exception 類的父類都是 Throwable 類,他們的區別如下。
Error 類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。對於這類 錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception 類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,而不應該隨意終止異常。


四. throw和throws的區別

throw:
1)throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
2)throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行 throw 一定是拋出了某種異常。
throws:
1)throws 語句是用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常的處理。
2)throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
3)throws 表示出現異常的一種可能性,並不一定會發生這種異常。

用法區別:
public static void test() throws Exception
{
   throw new Exception("方法test中的Exception");
}


五. final、finally、finalize的區別

1)final:用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。
2)finally:異常處理語句結構的一部分,表示總是執行。
3)finalize:Object 類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。該方法更像是一個對象生命週期的臨終方法,當該方法 被系統調用則代表該對象即將“死亡”,但是需要注意的是,我們主動行爲上去調用該方法並不會導致該對 象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用。
 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章