未选中异常或运行时异常之间的区别

2022-09-01 06:27:59

这是一个面试问题。未检查的异常和错误之间的主要区别是什么,因为两者都未被捕获?他们将终止该程序。


答案 1

正如它们的名称所述,未选中的异常在编译时不会被检查,这意味着编译器不需要方法来捕获或指定(使用)它们。属于此类别的类在 JLS 异常的编译时检查节中进行了详细介绍:throws

未经检查的异常类是类 RuntimeException 及其子类,以及类 Error 及其子类。所有其他异常类都经过检查的异常类。Java API 定义了许多异常类,包括选中和未选中。程序员可以声明其他异常类(包括选中的和未选中的)。有关异常类层次结构以及 Java API 和 Java 虚拟机定义的一些异常类的描述,请参见 §11.5

下图说明了异常层次结构:

alt text

该类及其子类是普通程序通常不应从中恢复的异常,如 11.5 异常层次结构中所述:Error

该类是 的一个单独的子类,与类层次结构中的不同,以允许程序使用成语:ErrorThrowableException

} catch (Exception e) {

以捕获可能从中恢复的所有异常,而不会捕获通常无法从中恢复的错误。

总而言之,是可以恢复的异常的未检查异常的子集(但未选中的异常不是此处回答的许多人的同义词)。RuntimeExceptionRuntimeException


答案 2

JavaDocs很好地总结了这些。

java.lang.RuntimeException

RuntimeException 是在 Java 虚拟机的正常操作期间可以引发的那些异常的超类。

方法不需要在其 throws 子句中声明 RuntimeException 的任何子类,这些子类可能在执行该方法期间引发但未被捕获。

java.lang.Error

Error 是 Throwable 的一个子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误都是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。

方法不需要在其 throws 子句中声明在执行方法期间可能引发但未捕获的任何 Error 子类,因为这些错误是永远不应该发生的异常情况。

请注意,“未选中的异常”只是 .RuntimeException