Java異常類
異常類層次結構
異常類層次結構從java.lang.Throwable
類開始。當拋出異常時,它必須是Throwable
類的對象或其任何子類。
catch
塊的參數必須是Throwable
類型或其子類,例如:Exception
,ArithmeticException
,IOException
等。
可以通過繼承一個異常類類來創建自己定義的異常類。
組織排列多個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.");
}
}
}