# 捕获和处理异常

> 原文： [https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html](https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html)

本节描述如何使用三个异常处理程序组件 - `try`，`catch`和`finally`块 - 来编写异常处理程序。然后，解释了 Java SE 7 中引入的`try-` with-resources 语句。 `try-` with-resources 语句特别适合使用`Closeable`资源的情况，例如流。

本节的最后一部分将介绍一个示例，并分析各种场景中发生的情况。

以下示例定义并实现名为`ListOfNumbers`的类。构造时，`ListOfNumbers`创建一个包含 10 个`Integer`元素的`ArrayList`，其顺序值为 0 到 9\. `ListOfNumbers`类还定义了一个名为`writeList`的方法，该方法将数字列表写入一个名为的文本文件中`OutFile.txt`。此示例使用`java.io`中定义的输出类， [Basic I / O](../io/index.html) 中介绍了这些输出类。

```
// 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）或太大（大于当前包含的元素数），则抛出`IndexOutOfBoundsException`由`ArrayList`）。

如果您尝试编译 [``ListOfNumbers``](examples/ListOfNumbers.java)类，编译器将打印有关`FileWriter`构造函数抛出的异常的错误消息。但是，它不会显示有关`get`引发的异常的错误消息。原因是构造函数`IOException`抛出的异常是一个经过检查的异常，而`get`方法`IndexOutOfBoundsException`抛出的异常是一个未经检查的异常。

现在您已熟悉`ListOfNumbers`类以及可以在其中抛出异常的位置，您已准备好编写异常处理程序来捕获和处理这些异常。