该Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不再支持的选项的信息,请参阅JDK发行说明。
你可以在try
块后面直接提供一个或多个catch
块来关联异常处理程序。在try
块的结尾和第一个catch
块的开始之间不能有任何代码。
try { } catch (异常类型 名称) { } catch (异常类型 名称) { }
每个catch
块都是一个异常处理程序,用于处理其参数指示的异常类型。参数类型异常类型
声明了处理程序可以处理的异常类型,必须是从Throwable
类继承的类的名称。处理程序可以使用名称
来引用异常。
catch
块包含在异常处理程序被调用时执行的代码。当处理程序是调用堆栈中第一个类型与抛出的异常类型匹配的处理程序时,运行时系统会调用异常处理程序。如果抛出的对象可以合法地分配给异常处理程序的参数,系统将认为它是匹配的。
以下是writeList
方法的两个异常处理程序:
try { } catch (IndexOutOfBoundsException e) { System.err.println("IndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); }
异常处理程序不仅可以打印错误消息或停止程序,还可以进行错误恢复、提示用户进行决策,或使用链接异常将错误传播到更高级别的处理程序中,如链接异常部分所述。
在Java SE 7及更高版本中,一个catch
块可以处理多种类型的异常。这个特性可以减少代码重复,并减少捕获过于宽泛异常的诱惑。
在catch
子句中,指定该块可以处理的异常类型,并用竖线(|
)分隔每个异常类型:
catch (IOException|SQLException ex) { logger.log(ex); throw ex; }
注意:如果一个catch
块处理多个异常类型,则catch
参数隐式为final
。在这个示例中,catch
参数ex
是final
,因此不能在catch
块内给它赋值。