本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
本节介绍如何使用三个异常处理组件 —— try
、catch
和 finally
块 —— 编写异常处理程序。然后,解释了在Java SE 7中引入的 try-
with-resources 语句。 try-
with-resources 语句特别适用于使用 Closeable
资源(例如流)的情况。
本节的最后部分通过一个示例演示并分析了各种情况下的发生情况。
以下示例定义并实现了一个名为 ListOfNumbers
的类。在构造时,ListOfNumbers
创建了一个包含10个整数元素(值从0到9)的 ArrayList
。 ListOfNumbers
类还定义了一个名为 writeList
的方法,该方法将数字列表写入名为 OutFile.txt
的文本文件中。此示例使用了 java.io
中定义的输出类,这些类在 基本 I/O 中有介绍。
// 注意:此类尚未编译。 import java.io.*; import java.util.List; import java.util.ArrayList; public class ListOfNumbers { private List<Integer> list; private static final int SIZE = 10; public ListOfNumbers () { list = new ArrayList<Integer>(SIZE); for (int i = 0; i < SIZE; i++) { list.add(new Integer(i)); } } public void writeList() { // FileWriter 构造函数会抛出 IOException,必须捕获。 PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) { // get(int) 方法会抛出 IndexOutOfBoundsException,必须捕获。 out.println("Value at: " + i + " = " + list.get(i)); } out.close(); } }
粗体显示的第一行是对构造函数的调用。构造函数会在文件上初始化一个输出流。如果文件无法打开,构造函数会抛出 IOException
。粗体显示的第二行是对 ArrayList
类的 get
方法的调用,如果其参数的值太小(小于0)或太大(大于当前 ArrayList
包含的元素数量),则会抛出 IndexOutOfBoundsException
。
如果尝试编译
类,编译器会打印关于 ListOfNumbers
FileWriter
构造函数抛出的异常的错误消息。然而,它不会显示关于 get
抛出的异常的错误消息。原因是构造函数抛出的异常 IOException
是已检查异常,而 get
方法抛出的异常 IndexOutOfBoundsException
是未检查异常。
现在,你已经熟悉了 ListOfNumbers
类以及其中可能引发异常的位置,你可以编写异常处理程序来捕获和处理这些异常。