文档

Java™教程
隐藏目录
捕获或指定要求
路径:基本Java类
课程:异常

捕获或指定要求

有效的Java编程语言代码必须遵守捕获或指定要求。这意味着可能引发某些异常的代码必须被以下两种情况之一包围:

不遵守捕获或指定要求的代码将无法编译。

并非所有异常都适用于捕获或指定要求。为了理解原因,我们需要了解三种基本的异常类别,只有其中一种适用于要求。

三种异常类型

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

已检查异常适用于捕获或指定要求。除了由ErrorRuntimeException及其子类指示的异常外,所有异常都是已检查异常。

第二种异常类型是错误。这些是应用程序外部的异常情况,应用程序通常无法预见或从中恢复。例如,假设应用程序成功打开了一个输入文件,但由于硬件或系统故障而无法读取该文件。无法成功读取将抛出java.io.IOError。应用程序可能选择捕获此异常,以便通知用户问题,但也可能有意义的是程序打印堆栈跟踪并退出。

错误不适用于捕获或指定要求。错误是由Error及其子类指示的异常。

第三种异常类型是运行时异常。这些是应用程序内部的异常情况,应用程序通常无法预见或从中恢复。这些通常表示编程错误,如逻辑错误或不正确使用API。例如,考虑先前描述的将文件名传递给FileReader构造函数的应用程序。如果逻辑错误导致将null传递给构造函数,构造函数将抛出NullPointerException。应用程序可以捕获此异常,但更合理的做法是消除导致异常发生的错误。

运行时异常 不受捕获或指定要求的限制。运行时异常是由RuntimeException及其子类表示的异常。

错误和运行时异常合称为未经检查的异常

绕过捕获或指定

一些程序员认为捕获或指定要求是异常机制的一个严重缺陷,并通过使用未经检查的异常来绕过它。一般来说,这并不推荐。本教程中的未经检查的异常 — 争议部分讨论了何时适合使用未经检查的异常。


上一页: 什么是异常?
下一页: 捕获和处理异常