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

时间:2010-04-23 15:00:00

标签: java exception unchecked-exception

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

8 个答案:

答案 0 :(得分:60)

正如其名称所述,未经检查的异常 未在编译时检查,这意味着编译器不需要捕获或指定方法(使用throws)他们。属于此类别的类详见JLS的11.2 Compile-Time Checking of Exceptions部分:

  

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

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

alt text

Error及其子类是普通程序通常不会恢复的例外情况,如11.5 The Exception Hierarchy中所述:

  

班级Error是独立的   Throwable的子类,不同于   类层次结构中的Exception   允许程序使用这个成语:

} catch (Exception e) {
     

捕获所有异常   没有可能恢复   捕获恢复的错误   通常是不可能的。

总结一下,RuntimeException未经检查的例外的子集,用于可以进行恢复的异常(但未经检查的异常不是RuntimeException的同义词,因为许多人在这里回答)。

答案 1 :(得分:9)

JavaDocs很好地总结了这些。

java.lang.RuntimeException

  

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

     

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

java.lang.Error

  

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

     

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

请注意,“未经检查的例外”仅仅是RuntimeException的同义词。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

错误表示不应发生的基本问题。如果你遇到错误s.th.真的很糟糕。
另一方面,未经检查的异常(运行时异常)只要能以某种方式预期异常就​​会被使用,但是没有合理的方法来处理它,因此try catch语句会让人烦恼而浪费空间。

答案 4 :(得分:3)

已检查例外:

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

未选中的例外:

  • 扩展RuntimeException的类称为未经检查的例外
  • 在编译时不检查未经检查的异常,而不是在运行时检查它们。这就是为什么它们也被称为"运行时异常"
  • 它们也是可编程恢复的问题,但与已检查的异常不同,它们是由代码流或配置中的错误引起的。
  • 示例: ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException
  • 由于它们是编程错误,因此可以通过良好/明智的编码来避免它们。例如"除以零"发生ArithmeticEceeption。我们可以通过一个简单的if条件来避免它们 - if(divisor!=0)。同样,我们可以通过简单地检查引用来避免NullPointerException - if(object!=null)或使用偶数better techniques

错误:

  • Error指的是未被try / catch
  • 处理的无法恢复的情况
  • 示例: OutOfMemoryErrorVirtualMachineErrorAssertionError等。

答案 5 :(得分:2)

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

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

您可能需要阅读this

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

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

您可能需要查看此链接,该链接解释了三种例外情况。

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

我希望这会有所帮助。