Java異常類


異常類層次結構

異常類層次結構從java.lang.Throwable類開始。當丟擲異常時,它必須是Throwable類的物件或其任何子類。

catch塊的引數必須是Throwable型別或其子類,例如:ExceptionArithmeticExceptionIOException等。

可以通過繼承一個異常類類來建立自己定義的異常類。

組織排列多個catch塊

Java執行時選擇適當的catch塊,並從第一個catch塊開始順序尋找合適的catch塊。
try塊的多個catch塊必須從最具體的異常型別排列為最通用的異常型別。

以下程式碼使用多個catch塊的有效序列。

ArithmeticException類是RuntimeException類的子類。

如果這兩個異常都在同一個try塊的catch塊中處理,那麼最具體的型別,即 ArithmeticException,必須出現在最通用的型別之前,即放在RuntimeException異常類之前。

try  {
// Do  something, which  might  throw  Exception
}
catch(ArithmeticException e1)  {
// Handle  ArithmeticException first
}
catch(RuntimeException e2)  {
// Handle  RuntimeException after  ArithmeticException
}

已檢查和未檢查異常

有三種型別的異常:

  • 有一些異常,有更高的發生可能。可以在try-catch塊中處理它們。或者在呼叫方法/建構函式宣告中指定丟擲異常。

  • 錯誤是可能發生的異常,並且幾乎不能處理它。 例如,java.lang.OutOfMemeoryError。 在程式中也不能做任何事情從記憶體不足錯誤中恢復。異常類是層次結構中的類,它們是Error類的子類和Error類,屬於此類別的異常。
    編譯器不對這類程式碼採取處理。如果在執行時丟擲此類異常,執行時將通過顯示詳細的錯誤訊息並暫停應用程式來處理它。

  • 在執行時可能會發生異常,可從異常條件中恢復。
    異常類是層次結構中的類,它們是RuntimeException類的子類和RuntimeException類本身,屬於此類別。

第一種異常分類稱為檢查異常,因為編譯器檢查它們是否在程式碼中有處理了。Throwable類,Exception類和Exception類的子類(不包括RuntimeException類及其子類)稱為檢查異常。

所有未檢查異常的異常稱為未檢查異常,因為編譯器不檢查它們是否在程式碼中有處理。Error類,Error類的所有子類,RuntimeException類及其所有子類都是未檢查的異常。

當然也可以處理未檢查的異常,但是這不是編譯器強迫要求的。用於處理已檢查或未檢查異常的程式結構是相同的。

以下程式碼顯示如何處理已檢查的異常

import java.io.IOException;

public class Main {
  public static void main(String[] argv) {
    try {
      int input = System.in.read();
      if (input != -1) {
        System.out.println(input);
      }
    } catch (IOException e) {
      System.out.print("IOException occurred.");
    }
  }
}