Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
本节介绍如何使用三个异常处理程序组件 try
,catch
,finally
块 来编写异常处理程序。然后,解释了 Java SE 7 中引入的 try-
with-resources 语句。try-
with-resources 语句特别适合使用 Closeable
资源的情况,例如流。
本节的最后一部分将介绍一个示例,并分析各种情况下发生的情况。
以下示例定义并实现名为 ListOfNumbers
的类。构造时,ListOfNumbers
创建一个 ArrayList
,其中包含 10 个 Integer
元素,其序列值为 0 到 9。ListOfNumbers
类还定义了一个名为 writeList
的方法,该方法将数字列表写入名为 OutFile.txt
的文本文件中。此示例使用 java.io
中定义的输出类,它们包含在 Basic I/O 中。
// Note: This class will not compile yet. 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() { // The FileWriter constructor throws IOException, which must be caught. PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) { // The get(int) method throws IndexOutOfBoundsException, which must be caught. out.println("Value at: " + i + " = " + list.get(i)); } out.close(); } }
第一粗体行是对构造函数的调用。构造函数初始化文件上的输出流。如果无法打开文件,构造函数将抛出 IOException
。第二个粗体行是对 ArrayList
类的 get
方法的调用,如果其参数的值太小(比 0 小)或太大(超过 ArrayList
当前包含的元素数量),则抛出 IndexOutOfBoundsException
。
如果你尝试编译
类,编译器将输出有关 ListOfNumbers
FileWriter
抛出的异常的错误消息构造函数。但是,它不会显示有关 get
引发的异常的错误消息。原因是构造函数 IOException
抛出的异常是一个检查型异常,而是由 get
方法抛出的异常,IndexOutOfBoundsException
,是一个非检查型异常。
现在你已熟悉 ListOfNumbers
类以及可以在其中抛出异常的位置,你已准备好编写异常处理程序来捕获和处理这些异常。