catch或指定要求

有效的 Java 编程语言代码必须遵守“catch”或“指定要求”。这意味着可能引发某些异常的代码必须用以下任意一种括起来:

  • catch异常的try语句。 try必须提供该异常的处理程序,如catch和处理异常中所述。

  • 一种指定可以引发异常的方法。该方法必须提供throws子句,其中列出了异常,如指定方法引发的异常中所述。

无法满足“catch”或“指定要求”的代码将无法编译。

并非所有 exception 都必须符合“catch”或“指定要求”。要理解原因,我们需要查看三种基本的 exception 类别,其中只有一种受要求约束。

三种 exception

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

已检查的异常受“catch”或“指定要求”的约束。除ErrorRuntimeException及其子类指示的异常外,所有异常均为已检查的异常。

第二种 exception 是错误。这些是应用程序外部的异常条件,应用程序通常无法预期或从中恢复。例如,假设应用程序成功打开了文件以供 Importing,但是由于硬件或系统故障而无法读取该文件。读取失败将抛出java.io.IOError。应用程序可能选择catch此异常,以便将问题通知用户-但对于程序来说,打印堆栈跟踪并退出也可能是有意义的。

错误不受“catch”或“指定要求”的约束。错误是由Error及其子类指示的那些异常。

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

运行时异常不受“catch”或“指定要求”的约束。运行时异常是由RuntimeException及其子类指示的异常。

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

绕过catch或指定

一些程序员认为catch或指定需求是异常机制中的严重缺陷,并通过使用未检查的异常代替检查的异常来绕过它。通常,不建议这样做。 未经检查的 exceptions-争议部分讨论何时适合使用未经检查的异常。