35

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

4

8 回答 8

64

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

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

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

替代文字

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

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

} catch (Exception e) {

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

总而言之,RuntimeException未检查异常的子集,用于可以从中恢复的异常(但未检查异常不是RuntimeException这里回答的许多人的同义词)。

于 2010-04-23T16:09:44.867 回答
10

JavaDocs 很好地总结了这些。

java.lang.RuntimeException

RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。

方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 RuntimeException 子类。

java.lang.Error

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

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

请注意,“未经检查的异常”只是 a 的同义词RuntimeException

于 2010-04-23T15:09:07.480 回答
5

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

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

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

于 2010-04-23T15:10:23.497 回答
3

检查异常:

  • 扩展Throwable类 exceptRuntimeException的类Error称为检查异常。
  • 也称为编译时异常,因为这些类型的异常是在编译时检查的。这意味着如果我们忽略这些异常(未处理try/catchthrow异常),则会发生编译错误。
  • 它们是由代码无法控制的意外情况(例如数据库关闭、文件 I/O 错误、错误输入等)引起的可通过编程恢复的问题
  • 我们可以使用try/catch块来避免它们。
  • 示例IOExceptionSQLException

未经检查的异常:

  • 扩展的类RuntimeException称为未经检查的异常
  • 未经检查的异常不在编译时检查,而是在运行时检查。这就是为什么它们也被称为“运行时异常”
  • 它们也是可通过编程方式恢复的问题,但与检查异常不同,它们是由代码流或配置中的错误引起的。
  • 示例ArithmeticException,NullPointerExceptionArrayIndexOutOfBoundsException
  • 由于它们是编程错误,因此可以通过巧妙/明智地编码来避免它们。例如出现“除以零” ArithmeticEceeption。我们可以通过一个简单的 if 条件来避免它们 - if(divisor!=0)。同样,我们可以NullPointerException通过简单地检查参考资料来避免 -if(object!=null)或者使用更好的技术

错误:

  • Error指 try/catch 未处理的不可恢复的情况
  • 示例: OutOfMemoryError ,VirtualMachineErrorAssertionError
于 2015-01-04T09:12:14.197 回答
3

错误表明不应该发生的基本问题。如果你遇到错误…… 真的很糟糕。
另一方面,当可能以某种方式预期异常但没有合理的方法来处理它时,就会使用未经检查的异常(运行时异常),因此 try catch 语句只会令人讨厌并且浪费空间。

于 2010-04-23T15:31:09.450 回答
2

错误:这些是应用程序外部的异常情况,应用程序通常无法预期或从中恢复。

运行时异常:这些是应用程序内部的异常情况,应用程序通常无法预料或从中恢复。

您可能想阅读以下内容:

于 2013-12-18T01:44:11.587 回答
1

RuntimeExceptionsOutOfMemoryError并且不需要捕获诸如此类的错误,并且可以将其抛出,直到它们到达将终止应用程序的 main() 。

如果其他异常没有被捕获或包含在抛出列表中,则会导致编译错误。

于 2010-04-23T15:09:54.613 回答
1

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

运行时异常是应用程序内部的异常情况,应用程序通常无法预期或从中恢复。这些通常表示编程错误,例如逻辑错误或 API 使用不当

您可能想查看解释三种例外情况的此链接。

http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

我希望这有帮助。

于 2013-01-27T22:10:19.760 回答