本教程是针对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。
如果尝试编译 类,编译器会打印关于 ListOfNumbersFileWriter 构造函数抛出的异常的错误消息。然而,它不会显示关于 get 抛出的异常的错误消息。原因是构造函数抛出的异常 IOException 是已检查异常,而 get 方法抛出的异常 IndexOutOfBoundsException 是未检查异常。
现在,你已经熟悉了 ListOfNumbers 类以及其中可能引发异常的位置,你可以编写异常处理程序来捕获和处理这些异常。