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. <!--[endif]-->
當這個異常發生時,如何及時捕獲這個異常。
<!--[if !supportLists]-->
2. <!--[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
的處理,如以上代碼所示。