內置異常子類
在標準包java.lang中,Java定義了若干個異常類。前面的例子曾用到其中一些。這些異常一般是標準類RuntimeException的子類。因為java.lang實際上被所有的Java程序引入,多數從RuntimeException派生的異常都自動可用。而且,它們不需要被包含在任何方法的throws列表中。 Java語言中,這被叫做未經檢查的異常(unchecked exceptions )。因為編譯器不檢查它來看一個方法是否處理或拋出了這些異常。 java.lang中定義的未經檢查的異常列於表1。表2列出了由java.lang定義的必須在方法的throws列表中包括的異常,如果這些方法能產生其中的某個異常但是不能自己處理它。這些叫做受檢查的異常(checked exceptions)。 Java定義了幾種與不同類庫相關的其他的異常類型。
表1:Java 的java.lang 中定義的未檢查異常子類
表2:java.lang 中定義的檢查異常
使用Java創建自己的異常子類
儘管Java的內置異常處理大多數常見錯誤,你也許希望建立你自己的異常類型來處理你所應用的特殊情況。這是非常簡單的:只要定義Exception的一個子類就可以了(Exception當然是Throwable的一個子類)。你的子類不需要實際執行什麼――它們在類型系統中的存在允許你把它們當成異常使用。
Exception類自己沒有定義任何方法。當然,它繼承了Throwable提供的一些方法。因此,所有異常,包括你創建的,都可以獲得Throwable定義的方法。這些方法顯示在表3中。你還可以在你創建的異常類中覆蓋一個或多個這樣的方法。
表3 Throwable 定義的方法
下面的例子聲明了Exception的一個新子類,然後該子類當作方法中出錯情形的信號。它重載了toString( )方法,這樣可以用println( )顯示異常的描述。
// This program creates a custom exception type.class MyException extends Exception { private int detail; MyException(int a) { detail = a; } public String toString() { return "MyException[" + detail + "]"; }} class ExceptionDemo { static void compute(int a) throws MyException { System.out.println("Called compute(" + a + ")"); if(a > 10) throw new MyException(a); System.out.println ("Normal exit"); } public static void main(String args[]) { try { compute(1); compute(20); } catch (MyException e) { System.out.println("Caught " + e) ; } }}
該例題定義了Exception的一個子類MyException。該子類非常簡單:它只含有一個構造函數和一個重載的顯示異常值的toString( )方法。 ExceptionDemo類定義了一個compute( )方法。該方法拋出一個MyException對象。當compute( )的整型參數比10大時該異常被引發。
main( )方法為MyException設立了一個異常處理程序,然後用一個合法的值和不合法的值調用compute( )來顯示執行經過代碼的不同路徑。下面是結果:
Called compute(1)Normal exitCalled compute(20)Caught MyException[20]