天天看點

java異常體系2 自定義異常類型3 異常的處理方式4 try-catch-finally 的執行順序

1.異常的繼承體系結構

java異常體系2 自定義異常類型3 異常的處理方式4 try-catch-finally 的執行順序
  • 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 常見的非檢查性異常:

java異常體系2 自定義異常類型3 異常的處理方式4 try-catch-finally 的執行順序

1.2.2 常見的檢查性異常:

java異常體系2 自定義異常類型3 異常的處理方式4 try-catch-finally 的執行順序

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 語句的情況。

繼續閱讀