未经检查的异常或运行时异常之间的区别

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与类层次结构不同,允许程序使用该习语:

} catch (Exception e) {
Run Code Online (Sandbox Code Playgroud)

捕获所有可能进行恢复的异常,而不会发现通常无法进行恢复的错误.

总而言之,是可以进行恢复的异常RuntimeException未经检查异常的子集(但未经检查的异常不是RuntimeException这里有许多人回答的同义词).


mat*_*t b 10

JavaDocs很好地总结了这些.

java.lang.RuntimeException:

RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类.

一个方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未捕获.

java.lang.Error:

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.大多数此类错误都是异常情况.ThreadDeath错误,虽然是"正常"条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它.

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

请注意,"未经检查的异常"仅仅是a的同义词RuntimeException.


Dav*_*ton 5

注意:RuntimeException是未经检查的异常

未检查的异常是在执行的某个时刻可能发生但未被捕获的异常,例如,如果不检查它们,则总是可能发生NullPointerException,这将导致程序终止。您可以通过将代码包装在try-catch中来进行检查,但这不是强制性的(不同于经过检查的异常会强制以某种方式处理该异常)。

错误是在执行过程中的任何时候都可能发生的错误,由于它不是由特定的方法调用等明显引起的,因此无法真正捕获。例如,OutOfMemoryError或StackOverflowError。这两种情况都可能随时发生,并会导致您的应用程序终止。捕获这些错误没有任何意义,因为它们表明发生了一些您将无法恢复的事情。

  • 不,相反。运行时异常IS-A未检查的异常。 (4认同)