文档

Java™ 教程-Java Tutorials 中文版
捕获和处理异常
Trail: Essential Classes
Lesson: Exceptions

捕获和处理异常

本节介绍如何使用三个异常处理程序组件 — trycatchfinally 块 — 来编写异常处理程序。然后,解释了 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 类以及可以在其中抛出异常的位置,你已准备好编写异常处理程序来捕获和处理这些异常。


Previous page: The Catch or Specify Requirement
Next page: The try Block