在try代码块的后面提供一个或多个catch代码块,就可以给try代码块关联异常处理器。在代码块之间不可以有任何其他代码。

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

每个catch代码块都是一个异常处理器,处理参数所代表的异常类型。参数类型,ExceptionType,声明了处理器可以处理的异常类型,必须是一个继承了Throwable类的类名称,处理器可以通过名字访问异常信息。

当异常处理器被触发,catch代码块里面的代码就会被执行。如果在调用栈(call stack)中某处理器的异常类型( ExceptionType)最先匹配上了抛出的异常,那么运行时系统就会触发这个处理器。如果抛出的对象可以合法地赋值给异常处理器的参数,系统就会认为匹配上了。

下面的代码包含了writeList方法中的两个异常处理器:

try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

异常处理器可以做的不仅仅是打印错误消息或停止程序,它们可以做错误恢复,提示用户做一个决定,或者使用异常链把错误传给更高级别的处理器。在 Chained Exceptions 章节中会有描述。

在一个异常处理器中捕获多个异常类型

从Java SE 7开始,单个catch代码块可以处理多个异常类型。这个特性可以减少代码重复,并且可以减少使用范围过于宽泛的异常类型的诱惑。

在catch从句中,指定代码块可以处理的所有异常类型,用(|)隔开:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

备注:如果一个catch代码块处理了多种异常类型,参数就默认为final。在这个例子中,ex就是final的,你不能在catch代码块中再给它赋值。





原文地址