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
异常类来处理特殊的异常,或者编写自定义的异常类来达到一样目的,问题的关键是:
1.
当这个异常发生时,如何及时捕获这个异常。
2.
捕获这个异常后,如何产生精确的异常处理信息。
毋庸置疑,咱们不可能期待
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
的处理,如以上代码所示。