Java的自定義異常類

菜雞03號發表於2016-10-27

11.7.1  編寫自定義異常類的模式

編寫自定義異常類實際上是繼承一個API標準異常類,用新定義的異常處理資訊覆蓋原有資訊的過程。常用的編寫自定義異常類的模式如下:
 
public class CustomException extends Exception {    //或者繼承任何標準異常類
    public CustomException()  {}                //用來建立無引數物件
    public CustomException(String message) {        //用來建立指定引數物件
        super(message);                             //呼叫超類構造器
    }
}
 
當然也可選用Throwable作為超類。其中無引數構造器為建立預設引數物件提供了方便。第二個構造器將在建立這個異常物件時提供描述這個異常資訊的字串,通過呼叫超類構造器向上傳遞給超類,對超類中的toString()方法中返回的原有資訊進行覆蓋。
來討論一個具體例子。假設程式中需要驗證使用者輸入的表示年齡的資料必須是正整數值。我們可以按照以上模式編寫這個自定義異常類如下:
 
public class NegativeAgeException extends Exception {
                                            //或者:extends Throwable
    public NegativeAgeException()  {}
    public NegativeAgeException(String message) {
        super(message);
    }
}
 
下面是應用這個自定義異常類的例子:
 
//完整程式存在本書配套資源目錄為Ch11中名為NegativeAgeExceptionTest.java
...
try{
   String ageString = JOptionPane.showInputDialog("Enter your age: ");
 
   if (Integer.parseInt(ageString) < 0)
        throw new NegativeAgeException("Please enter a positive age");
   else
        JOptionPane.showMessageDialog(null, ageString, "Age", 1);
}
catch(NegativeAgeException e){
    System.out.println(e);
}
...
 
或者,可以建立一個預設物件,然後在catch中列印具體資訊,如:
 
    throw new NegativeAgeException();
    ...
catch (NegativeAgeException e) {
    System.out.println("Please enter a positive age");
 
 
將產生與第一個例子相同的效果。

11.7.2  自定義異常處理

無論是利用標準API異常類來處理特殊的異常,或者編寫自定義的異常類來達到同樣目的,問題的關鍵是:
<!--[if !supportLists]-->1.<span style="font: 7pt " times="" new="" roman';="" none;="" normal;="" none"="">         <!--[endif]-->當這個異常發生時,如何及時捕獲這個異常。
<!--[if !supportLists]-->2.<span style="font: 7pt " times="" new="" roman';="" none;="" normal;="" none"="">         <!--[endif]-->捕獲這個異常後,如何產生精確的異常處理資訊。
       毋庸置疑,我們不可能期待JVM自動丟擲一個自定義異常,也不能夠期待JVM會自動處理一個自定義異常。發現異常、丟擲異常以及處理異常的工作必須靠程式設計人員在程式碼中利用異常處理機制自己完成。
一般情況下,發現和丟擲一個自定義異常通過在try程式塊中利用if和throw語句完成,即:
 
try {
    ...
    if (someExceptionConditon == true) {
        throw new CustomException("A custom exception xxx occurred. Please
        check your entry...")
    ...
    }
catch (CustomException e) {
    ...
}
 
而列印異常處理資訊可以在丟擲時包括在構造器的引數中,或者包括在處理這個異常的catch中。
另外應該注意在自定義異常發生之前,有可能產生標準異常的情況。例如,在一個需要驗證年齡必須是正整數值的程式中,利用自定義異常類,如NegativeAgeException,驗證輸入的年齡是否正整數,即:
 
try {
    ...
    if (Integer.parseInt(ageString) < 0)     
        throw NegativeAgeException("Please enter a positive age");
    else
        ...
    }
    catch (NumberFormatException e) {
        System.out.println(e);
    }
    catch (NegativeAgeException e) {
        System.out.println(e);
    }
    ...
 
注意在這個程式碼中,如果ageString是非法整數字符串,如“25ab”,系統將首先丟擲NumberFormatException,而不會執行throw NegativeAgeException("Please enter a positive age")。所以應該在catch中加入對NumberFormatException的處理,如以上程式碼所

相關文章