1. 程式人生 > >Java程式設計思想之通過異常處理錯誤

Java程式設計思想之通過異常處理錯誤

1.     異常分為被檢查的異常和執行時異常,被檢查的異常在編譯時被強制要求檢查。異常被用來錯誤報告和錯誤恢復,但很大一部分都是用作錯誤報告的。

2.     異常情形是由於當前環境下無法得到必要的資訊導致當前方法或作用域無法繼續執行。當丟擲異常時,首先在堆上建立了異常物件,其次當前的執行路徑中止並在當前環境中彈出對異常物件的引用,此時異常處理機制接管程式,並開始尋找一個恰當的地方來繼續執行程式。

3.     異常最重要的方面之一是如果發生了問題,將不允許程式沿著其正常路徑繼續走下去。

4.     所有標準異常類有兩個構造器,一個是預設構造器,一個是接受相關資訊字串在為引數的構造器。異常型別的根類是Throwable類,錯誤資訊可以儲存在異常物件的內部或用異常類的名稱來暗示。

5.     異常處理程式緊跟在try塊之後,以關鍵字catch表示。每個catch字句是隻接受一個特殊型別的引數的方法。異常處理理論有兩種模型:終止模型和恢復模型。

6.     自定義異常來表示程式中可能碰到的特定問題,通過繼承已有的異常類。System.err是標準錯誤流,不會重定向,而System.out可能會重定向。異常類呼叫了了在Throwable類宣告的printStackTrace()方法,將列印“從異常丟擲處到方法呼叫處”的方法呼叫序列。

7.     Java.util.logging工具將輸出記錄到日誌中去。顯示日誌的方法是呼叫與日誌記錄訊息級別相關的方法severe()。記錄其他人編寫的異常並生成日誌的方法不同點:e.printStackTrace();

8.     異常說明資料方法宣告的一部分,緊跟在形參之後。其使用了throws複數關鍵字,後面接一個異常型別構成的列表。程式碼必須與異常說明一致。如果程式碼產生了異常,要麼處理這個異常,要麼在異常說明中表明此方法將產生異常。

9.     可以宣告方法將丟擲異常,實際上卻不丟擲。這樣就為異常先佔了位子,以後就可以丟擲這種異常而不用修改已有的程式碼,主要用在定義抽象基類和介面時。

10.  使用基類Exception可以捕獲所有異常。

11.  把剛捕獲的異常重新丟擲,異常物件的所有資訊都得以保持。也可以捕獲異常後丟擲另外一種異常。

12.  異常鏈:捕獲異常後丟擲另外一種異常,並儲存原始異常的資訊。三種基本的異常類帶有帶cause引數(表示原始異常)的構造器,是Error,Exception和RuntimeException。兩種方式:1. 帶cause引數(表示原始異常)的構造器,2.沒有此構造器的異常型別,通過initCause()方法來把異常連結起來。

13.  屬於執行時異常的型別有很多,它們自動被Java虛擬機器丟擲,所以不必在異常說明中列出來,稱為不受檢查的異常,代表程式設計錯誤,將被自動捕獲。但儘管通常不用捕獲RuntimeException異常,但還是可以在程式碼中丟擲RuntimeException型別的異常。如果RuntimeException型別的異常沒有被捕獲而直達main(),那麼在程式退出前將呼叫異常的printStackTrace()方法。

14.  當要把除記憶體之外的資源恢復到它們的初始狀態時,就要用到finally子句。異常沒被當前處理程式捕獲,但會執行finally字句。甚至在異常沒有被當前的異常處理程式捕獲的情況下,異常處理機制也會在跳到更高一層的異常處理程式之前,執行finally子句。當涉及continue和break語句時,也會執行finally子句。當涉及return時,先執行finally子句,再執行return。

15.  異常忽略丟失:try塊中丟擲的異常被finally子句丟擲的異常所取代,被catch語句捕獲到。如果直接在try-finally語句的finally字句中執行return,try塊丟擲的異常也會被忽略。

16.  當覆蓋方法時,只能丟擲在基類方法的異常說明裡列出的那些異常(及子類)。但是異常限制對構造器不起作用,子類的構造器可以不必理會基類構造器所丟擲的異常。子類的構造器的異常宣告必須包含基類構造器的異常宣告。派生類的構造器不能捕獲基類構造器丟擲的異常。強制派生類遵守基類方法的異常宣告。派生類可以不丟擲任何異常,即使它是基類所定義的異常。因為異常說明本身不屬於方法型別的一部分,因此不能基於異常說明來過載方法。一個出現在基類方法的異常說明的異常,不一定會出現在派生類方法的異常說明裡。

17.  如果在構造器內丟擲了異常,清理方法也許不能正常工作。對於建立物件的語句置於外部的try塊中,如果構造失敗,將進入外部的catch字句。如果構造成功,則確定物件能被清理,因此在構造之後,進入內部的try-catch-finally或try -finally塊,finally字句執行清理工作。基本原則是:在建立需要清理的物件之後,立刻進入try -finally塊。對於一群不能失敗的構造器的物件來說,從構造和清理出發,可以群組在一起。當對於那些具有可以失敗的構造器物件來說,得巢狀。

18.  異常匹配:丟擲異常時,異常處理系統會按照程式碼的書寫順序找到最近的處理程式,找到後,就預設異常會被處理,即使異常沒有被捕獲,然後就不會在繼續查找了。

19.  被檢查的異常強制你在沒有準備好處理錯誤時候被迫加入catch字句,導致吞下異常。解決方法:1. 通過給main方法throwsException來把異常傳遞給控制檯。2. 可以把被檢查的異常包裝在RuntimeException裡面,再throw出來,保證了既不需要寫try-catch塊,因為沒有丟擲被檢查的異常,也包裝了不會丟失任何原始異常的資訊。但是如果準備捕獲異常的時候,還是可以用try塊來捕獲你想要的異常。

20.  與恢復功能相比,報告功能才是異常的精髓所在。Java堅定強調將所有的錯誤都以異常的形式報告這一事實。