gir*_*iri 33 java exception unchecked-exception
这是一个面试问题.未检查的异常和错误之间的主要区别是什么,因为两者都没有被捕获?他们将终止该计划.
Pas*_*ent 62
如其名称所述,未在编译时检查未经检查的异常,这意味着编译器不需要捕获或指定(使用throws)它们的方法.属于此类的类在11.2编译时检查 JLS 异常部分中详细说明:
该unchecked异常类是类
RuntimeException和它的子类,类Error和它的子类.所有其他异常类都是已检查的异常类.Java API定义了许多异常类,包括已检查和未选中的异常类.程序员可以声明其他检查和未检查的异常类.有关异常类层次结构的描述以及Java API和Java虚拟机定义的一些异常类,请参见第11.5节.
下图说明了异常层次结构:

该类Error及其子类是普通程序通常不希望恢复的异常,如11.5异常层次结构中所述:
该类
Error是一个独立的子类Throwable,Exception与类层次结构不同,允许程序使用该习语:Run Code Online (Sandbox Code Playgroud)} catch (Exception e) {捕获所有可能进行恢复的异常,而不会发现通常无法进行恢复的错误.
总而言之,是可以进行恢复的异常RuntimeException的未经检查异常的子集(但未经检查的异常不是RuntimeException这里有许多人回答的同义词).
mat*_*t b 10
JavaDocs很好地总结了这些.
RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类.
一个方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未捕获.
Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.大多数此类错误都是异常情况.ThreadDeath错误,虽然是"正常"条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它.
一个方法不需要在其throws子句中声明在执行方法期间可能抛出但未捕获的任何Error类,因为这些错误是永远不应发生的异常情况.
请注意,"未经检查的异常"仅仅是a的同义词RuntimeException.
注意:RuntimeException是未经检查的异常
未检查的异常是在执行的某个时刻可能发生但未被捕获的异常,例如,如果不检查它们,则总是可能发生NullPointerException,这将导致程序终止。您可以通过将代码包装在try-catch中来进行检查,但这不是强制性的(不同于经过检查的异常会强制以某种方式处理该异常)。
错误是在执行过程中的任何时候都可能发生的错误,由于它不是由特定的方法调用等明显引起的,因此无法真正捕获。例如,OutOfMemoryError或StackOverflowError。这两种情况都可能随时发生,并会导致您的应用程序终止。捕获这些错误没有任何意义,因为它们表明发生了一些您将无法恢复的事情。