【问题标题】:Difference between Unchecked exception or runtime exception未经检查的异常或运行时异常之间的区别
【发布时间】:2010-04-23 15:00:00
【问题描述】:

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

【问题讨论】:

  • 您的标题与问题不同。你想知道RuntimeException和Error或者Unchecked和RuntimeException的区别吗?
  • 这不是X Y之间的差异,而是X Y之间的差异。确实,是在未检查异常和运行时异常之间,还是在未检查异常和错误之间?
  • 看起来同一个面试问题被问了很多:stackoverflow.com/questions/2693329/…

标签: java exception unchecked-exception


【解决方案1】:

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

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

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

Error 类及其子类是普通程序通常不会从中恢复的异常,正如 11.5 The Exception Hierarchy 中所述:

Error 是一个单独的类 Throwable 的子类,不同于 Exception 在类层次结构中,到 允许程序使用成语:

} catch (Exception e) {

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

总而言之,RuntimeExceptionunchecked exceptions 的子集,用于可以从中恢复的异常(但 unchecked exception 不是 RuntimeException 的同义词,因为这里有很多人回答)。 p>

【讨论】:

    【解决方案2】:

    JavaDocs 很好地总结了这些。

    java.lang.RuntimeException:

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

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

    java.lang.Error:

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

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

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

    【讨论】:

    • java.sun.com/docs/books/tutorial/essential/exceptions/… 也提供了对差异的体面描述
    • 我认为编写未经检查的异常是 RuntimeException 的同义词是误导(而且不是真的)。​​
    • @Pascal,怎么会这样?我认为每当有人提到 Java 中的“未经检查的异常”时,他们指的是 RuntimeException 的某个子类,不是吗?
    • 未经检查的异常是...未经检查的异常和未经检查的异常类是类RuntimeException及其子类Error及其子类。我不知道要添加什么,未经检查的异常不是RuntimeException 的同义词。
    【解决方案3】:

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

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

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

    【讨论】:

    • 不,恰恰相反。运行时异常是 - 未经检查的异常。
    【解决方案4】:

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

    【讨论】:

    • RuntimeException 是未经检查的异常的子集,不是同义词。
    【解决方案5】:

    检查异常:

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

    未经检查的异常:

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

    错误:

    • Error 指的是 try/catch 没有处理的不可恢复的情况
    • 示例: OutOfMemoryErrorVirtualMachineErrorAssertionError

    【讨论】:

      【解决方案6】:

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

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

      您可能想阅读this

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

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

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

          我希望这会有所帮助。

          【讨论】:

          • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
          • @ivarni 我更新了它希望有帮助:) 谢谢你的反馈。
          猜你喜欢
          • 2017-05-27
          • 2012-07-17
          • 2011-03-10
          • 1970-01-01
          • 2019-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-16
          相关资源
          最近更新 更多