# 捕获或指定要求

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

有效的 Java 编程语言代码必须遵守 _Catch 或 Specify Requirement_ 。这意味着可能抛出某些异常的代码必须包含以下任一项：

*   捕获异常的`try`语句。 `try`必须为异常提供处理程序，如[捕获和处理异常](handling.html)中所述。
*   一种方法，指定它可以抛出异常。该方法必须提供列出异常的`throws`子句，如[中指定由方法](declaring.html)引发的异常中所述。

不符合 Catch 或 Specify Requirement 的代码将无法编译。

并非所有例外都受 Catch 或 Specify Requirement 的约束。为了理解原因，我们需要查看三个基本类别的例外，其中只有一个受要求限制。

## 三种例外

第一种例外是 _ 检查异常 _。这些是编写良好的应用程序应该预期和恢复的特殊条件。例如，假设应用程序提示用户输入文件名，然后通过将名称传递给`java.io.FileReader`的构造函数来打开文件。通常，用户提供现有可读文件的名称，因此`FileReader`对象的构造成功，并且应用程序的执行正常进行。但有时用户提供不存在的文件的名称，构造函数抛出`java.io.FileNotFoundException`。一个编写良好的程序将捕获此异常并通知用户该错误，可能提示更正的文件名。

已检查的异常 _ 将 _ 置于“捕获”或“指定要求”中。除`Error`，`RuntimeException`及其子类指示的异常外，所有异常都是经过检查的异常。

第二种例外是 _ 错误 _。这些是应用程序外部的特殊条件，应用程序通常无法预测或恢复。例如，假设应用程序成功打开文件以进行输入，但由于硬件或系统故障而无法读取文件。不成功的读取将抛出`java.io.IOError`。应用程序可能会选择捕获此异常，以便通知用户该问题 - 但它也可能有助于程序打印堆栈跟踪并退出。

错误 _ 不受[捕获或指定要求]_ 的影响。错误是`Error`及其子类指示的异常。

第三种例外是 _ 运行时异常 _。这些是应用程序内部的异常条件，应用程序通常无法预测或恢复。这些通常表示编程错误，例如逻辑错误或 API 的不当使用。例如，考虑前面描述的应用程序将文件名传递给`FileReader`的构造函数。如果逻辑错误导致`null`传递给构造函数，构造函数将抛出`NullPointerException`。应用程序可以捕获此异常，但消除导致异常发生的错误可能更有意义。

运行时异常 _ 不受[捕获或指定要求]_ 的约束。运行时异常是`RuntimeException`及其子类指示的异常。

错误和运行时异常统称为 _ 未经检查的异常 _。

## 绕过 Catch 或指定

一些程序员认为 Catch 或 Specify Requirement 是异常机制中的一个严重缺陷，并通过使用未经检查的异常代替已检查的异常来绕过它。通常，不建议这样做。 [未经检查的例外 - 争议](runtime.html)部分讨论何时适合使用未经检查的例外。