java異常體系

1.異常的繼承體系結構

  • Throwable 類是 Java 語言中所有錯誤或異常的超類。
  • 只有當對象是此類(或其子類之一)的實例時,才能通過 Java 虛擬機或者 Java throw 語句拋出。類似地,只有此類或其子類之一纔可以是 catch 子句中的參數類型。
  • Throwable 包含了其線程創建時線程執行堆棧的快照。它還包含了給出有關錯誤更多信息的消息字符串。
  • 最後,它還可以包含 cause(原因):另一個導致此 throwable 拋出的 throwable。此 cause 設施在 1.4 版本中首次出現。它也稱爲異常鏈 設施,因爲 cause 自身也會有 cause,依此類推,就形成了異常鏈,每個異常都是由另一個異常引起的.

1.1 Error

  • Error 是 Throwable 的子類,用於指示合理的應用程序不應該試圖捕獲的嚴重問題
  • 大多數這樣的錯誤都是異常條件。雖然 ThreadDeath 錯誤是一個“正規”的條件,但它也是 Error 的子類,因爲大多數應用程序都不應該試圖捕獲它。
  • 在執行該方法期間,無需在其 throws 子句中聲明可能拋出但是未能捕獲的 Error 的任何子類,因爲這些錯誤可能是再也不會發生的異常條件。
  • Java 程序通常不捕獲錯誤。錯誤一般發生在嚴重故障時,它們在Java程序處理的範疇之外。

Exception 異常主要分爲兩類

  • 一類是 IOException(I/O 輸入輸出異常),其中 IOException 及其子類異常又被稱作「受查異常」
  • 另一類是 RuntimeException(運行時異常),RuntimeException 被稱作「非受查異常」。
  • 受查異常就是指,編譯器在編譯期間要求必須得到處理的那些異常,你必須在編譯期處理了。

1.2.1 常見的非檢查性異常:

1.2.2 常見的檢查性異常:

2 自定義異常類型

Java 的異常機制中所定義的所有異常不可能預見所有可能出現的錯誤,某些特定的情境下,則需要我們自定義異常類型來向上報告某些錯誤信息。

  • 在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
    • 所有異常都必須是 Throwable 的子類。
    • 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
    • 如果你想寫一個運行時異常類,那麼需要繼承 RuntimeException 類。

3 異常的處理方式

3.1 try...catch關鍵字

  • 使用 try 和 catch 關鍵字可以捕獲異常。
  • try/catch 代碼塊放在異常可能發生的地方。

try/catch代碼塊中的代碼稱爲保護代碼,使用 try/catch 的語法如下:

try {
   // 程序代碼
} catch(ExceptionName e1) {
   //Catch 塊
}
  • Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發生一個異常時,try 後面的 catch 塊就會被檢查。如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是一樣。
  • 一個 try 代碼塊後面跟隨多個 catch 代碼塊的情況就叫多重捕獲
  • 多重捕獲塊的語法如下所示:
try{
   // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}

3.2 throws/throw 關鍵字

  • 如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。也可以使用 throw 關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。
  • 下面方法的聲明拋出一個 RemoteException 異常:
public class className {
  public void deposit(double amount) throws RemoteException {
    // Method implementation
    throw new RemoteException();
  }
  //Remainder of class definition
}

一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。

3.3 finally關鍵字

  • finally 關鍵字用來創建在 try 代碼塊後面執行的代碼塊。
  • 無論是否發生異常,finally 代碼塊中的代碼總會被執行。在 finally 代碼塊中,可以運行清理類型等收尾善後性質的語句。
  • finally 代碼塊出現在 catch 代碼塊最後,語法如下:
try{
  // 程序代碼
}catch(異常類型1 異常的變量名1){
  // 程序代碼
}catch(異常類型2 異常的變量名2){
  // 程序代碼
}finally{
  // 程序代碼
}

4 try-catch-finally 的執行順序

try-catch-finally 執行順序的相關問題可以說是各種面試中的「常客」了,尤其是 finally 塊中帶有 return 語句的情況。

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