通过在try块之后直接提供一个或多个catch块,可以将异常处理程序与一个块try相关联。在try块的结尾和第一个catch块的开头之间不能有任何代码。

  1. try {
  2. } catch (ExceptionType name) {
  3. } catch (ExceptionType name) {
  4. }

每个catch块都是一个异常处理程序,用于处理其参数指示的异常类型。参数类型_ExceptionType_声明处理程序可以处理的异常类型,并且必须是从Throwable类继承的类的名称。处理程序可以使用引用异常_name_
catch块包含在调用异常处理程序时,以及在调用异常处理程序时,执行的代码。当该处理程序是调用堆栈中第一个与抛出的异常类型_ExceptionType_相匹配的处理程序时,运行时系统将调用该异常处理程序。如果可以合法地将抛出的对象分配给异常处理程序的参数,则系统认为它是匹配项。
以下是writeList方法的两个异常处理程序:

  1. try {
  2. } catch (IndexOutOfBoundsException e) {
  3. System.err.println("IndexOutOfBoundsException: " + e.getMessage());
  4. } catch (IOException e) {
  5. System.err.println("Caught IOException: " + e.getMessage());
  6. }

异常处理程序不仅可以打印错误消息或暂停程序,还可以做更多的事情。他们可以使用链式异常进行错误恢复,提示用户做出决定或将错误传播到更高级别的处理程序,如“链式异常”部分所述。

使用一个异常处理程序捕获不止一种类型的异常

在Java SE 7和更高版本中,单个catch块可以处理多种类型的异常。此功能可以减少代码重复,并减少捕获过于广泛的异常。
catch子句中,指定块可以处理的异常类型,并用竖线(|)分隔每种异常类型:

  1. catch (IOException|SQLException ex) {
  2. logger.log(ex);
  3. throw ex;
  4. }

注意:如果一个catch块处理一个以上的异常类型,则catch参数为隐式final。在此示例中,catch参数exfinal,因此您不能在catch块内为其分配任何值。