1. 程式人生 > >《Java編程思想》筆記 第十二章 通過異常處理錯誤

《Java編程思想》筆記 第十二章 通過異常處理錯誤

nts 無法 ble 多個 打印 while循環 sage 返回 機制

1.異常也是對象

  • 標準異常類都有兩個構造器,一個默認,一個接受字符串。

1.1 拋異常與方法返回類型不同,但有相似效果使當前方法退出並返回,拋異常可以看作是一種不同的返回機制。(異同點不必深究)

1.2 Throwable類對象可被任意異常拋出,它是異常的根類。

1.3 異常對象中僅有的就是異常類型,其他內容一般沒有。

1.4 一個方法內部或者內部調用其他方法拋出異常,這個方法就會在拋出異常過程中結束。

1.5 標識符id可能用不到但不能不寫,catch要緊跟在try塊之後,匹配到最合適的異常後進入catch之後的catch不在匹配,這與沒有break就會繼續匹配switch不同。

try
{ }catch(Type1 id1){ }catch(Type2 id2){ }...

2.恢復模型

  • catch不拋異常用來修復錯誤,或把try放入while循環裏這樣不斷的進入try直到得到滿意結果。

3.自定義異常

  • 要自定義異常必須從已有異常繼承。

4.將異常記錄在日誌中

Logger logger  = logger.getLogger(ExceptionName)
        
        StringWriter trace = new
StringWriter(); printStackTrace(new PrintWriter(trace)); logger.severe(trace.toString);

5.異常說明

  • 關鍵詞 throws 跟在方法後面,如f() throws Exception,Exception1, . . .{} 意味著這個方法f可能會拋出異常列表中的異常。 關鍵詞throw ,拋出一個異常。

6.異常類層次結構圖及其個別重要的子類

1.Throwable

1.1 Error

  • 錯誤,系統自身錯誤,JVM遇無法處理的錯誤,一般與代碼無關。

1.2 Exception

  • 與編程有關的所有異常基類。
  • 1.2.1 IOException : 輸入、輸出異常
  • 1.2.2 RuntimeException :運行時異常

7. 不可查的異常

  • Error和RuntimeException 又稱不可查的異常(unchecked exceptions)編譯器不要求強制處置的異常,可不用catch接受,其他Exception為可查的異常(checked exceptions)編譯器要求必須處置的異常.

8.棧軌跡

8.1 Throwable類的2個方法獲取異常信息。

  • String getMessage();獲取異常詳細信息(構造器內的添加的描述詳細)
  • String getLocalizedMessage(); 本地語言描述的詳細信息,默認和getMessage()一樣。
  • toString(); 直接打印異常標識符e

8.2 打印棧軌跡

  • void printStackTrace(); 輸出到標準錯誤
  • void printStackTrace(PrintStrean);輸出字節流
  • void printStackTrace(java.io.PrintWriter);輸出到字符流

9. 重新拋出接受到的異常

  • throw.e ,拋給上一級,本級後續catch不會再執行。重新拋出後棧軌跡還是原來的軌跡,更新這個信息則用throw (Exception)e.fillInStackTrace(); 這裏便成了異常新的發生地,就和這裏throw一個新異常一樣,棧軌跡從這裏開始。

10.異常鏈

11.finally 總能執行。

  • try--(catch可無)--finally

11.1 try finally 放在循環裏可以做到“程序繼續執行前必須要達到某個條件”。

11.2 使資源恢復到初始狀態可以finally

11.3 try塊執行停止(無catch)後在執行下一步操作之前finally會立刻執行

  • 在異常被拋到更高層前就會執行finally
  • break、continue或者帶標簽時finally也會先執行
  • return在finally也會先執行

11.4 可能造成原異常丟失的finally用法:

  • finally裏產生另一個異常
  • finally裏return。一般這種異常是運行時異常。

12.異常的限制

  • 覆蓋方法時只能拋出基類方法的異常列表中的一種或者多種異常或者其子類異常或者不拋,但不能拋出基類沒有的異常。

13.構造器異常

13.1 構造器拋了異常則創建對象後也要拋出異常,並且與構造器的完全一致。

13.2 父類構造器拋了異常,子類構造器必須拋出基類所有的異常,不可以不拋,並且可以拋出其他異常。

14.異常匹配

  • 基類異常會匹配子類異常,且只匹配第一個能匹配的catch,所以在多個catch中基類和子類異常都要匹配時,子類異常catch要出現在父類catch之前,如果出現在父類之後會被父類捕獲匹配子類catch永遠也不會被匹配,所以會報錯。

15.異常原則

  • 異常處理一個原則就是:只有知道了如何處理異常才去捕獲這個異常,否則就可能發生吞食,既異常發了卻不知道。

《Java編程思想》筆記 第十二章 通過異常處理錯誤