Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的概述。
请参阅JDK发行说明,了解所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息。
有效的Java编程语言代码必须遵守捕获或指定要求。这意味着可能引发某些异常的代码必须被以下两种情况之一包围:
不遵守捕获或指定要求的代码将无法编译。
并非所有异常都适用于捕获或指定要求。为了理解原因,我们需要了解三种基本的异常类别,只有其中一种适用于要求。
第一种异常类型是已检查异常。这些是一个良好编写的应用程序应该预见并从中恢复的异常情况。例如,假设一个应用程序提示用户输入一个输入文件名,然后通过将该名称传递给java.io.FileReader
的构造函数来打开文件。通常,用户提供现有可读文件的名称,因此FileReader
对象的构建成功,并且应用程序的执行正常进行。但有时用户提供了一个不存在的文件名,构造函数将抛出java.io.FileNotFoundException
。一个良好编写的程序将捕获此异常并通知用户错误,可能会提示输入一个更正的文件名。
已检查异常适用于捕获或指定要求。除了由Error
、RuntimeException
及其子类指示的异常外,所有异常都是已检查异常。
第二种异常类型是错误。这些是应用程序外部的异常情况,应用程序通常无法预见或从中恢复。例如,假设应用程序成功打开了一个输入文件,但由于硬件或系统故障而无法读取该文件。无法成功读取将抛出java.io.IOError
。应用程序可能选择捕获此异常,以便通知用户问题,但也可能有意义的是程序打印堆栈跟踪并退出。
错误不适用于捕获或指定要求。错误是由Error
及其子类指示的异常。
第三种异常类型是运行时异常。这些是应用程序内部的异常情况,应用程序通常无法预见或从中恢复。这些通常表示编程错误,如逻辑错误或不正确使用API。例如,考虑先前描述的将文件名传递给FileReader
构造函数的应用程序。如果逻辑错误导致将null
传递给构造函数,构造函数将抛出NullPointerException
。应用程序可以捕获此异常,但更合理的做法是消除导致异常发生的错误。
运行时异常 不受捕获或指定要求的限制。运行时异常是由RuntimeException
及其子类表示的异常。
错误和运行时异常合称为未经检查的异常。
一些程序员认为捕获或指定要求是异常机制的一个严重缺陷,并通过使用未经检查的异常来绕过它。一般来说,这并不推荐。本教程中的未经检查的异常 — 争议部分讨论了何时适合使用未经检查的异常。