本章节介绍如何使用异常处理器的三个组件——try、catch和finally代码块——用来写一个异常处理器。然后再介绍Java SE 7引入的try-with-resource语句,前面说过了。try-with-resource语句特别适合于使用Closeable类型资源的场景,比如流。

本章节的最后一部分通过一个例子,分析在各种不同的情况下会发生什么。

下面的例子定义并实现了一个叫做ListOfNumbers的类。当创建它的对象的时候,会创建一个包含10个Integer类型的ArrayList,并以此给它赋上0到9的值。ListOfNumbers还定义了一个方法叫做writeList,它把list里面的数值写入一个叫做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比较熟悉了,并且知道什么地方会抛出异常,你可以写异常处理器去捕获和处理异常了。





原文地址