【问题标题】:Why runtime exception is unchecked exception?为什么运行时异常是未经检查的异常?
【发布时间】:2012-07-17 20:59:29
【问题描述】:

一般来说,如果任何类扩展 Exception ,它就会变成检查异常。 Runtime exception 也扩展了异常。那unchecked exception怎么样?

他们是否在编译器中针对这种特殊情况进行了自定义检查?

编辑:我对 checked v/s unchecked exception 及其优缺点等有正确的认识。我不接受差异他们之间的回答。

【问题讨论】:

    标签: java exception runtimeexception


    【解决方案1】:

    规范中有明确规定,@​​987654321@:

    RuntimeException 及其所有子类统称为运行时异常类

    未经检查的异常类是运行时异常类和错误类。

    已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是 Throwable 的子类,除了 RuntimeException 及其子类和 Error 及其子类。

    所以是的,编译器肯定知道RuntimeException

    【讨论】:

    • 为什么我们不能检查运行时异常?我们知道可能有一个 NullPointerException 那么我们应该检查它。有什么想法吗?
    • @UnKnown:不,您不希望您编写的每个方法都必须捕获或声明 NullPointerException ......那太糟糕了。
    • 从概念上讲,已检查和未检查的异常没有区别?只是实现有所不同?
    • @UnKnown:这取决于你所说的“概念上”到底是什么意思。
    • 由于FileNotFoundException被编译器检查,所以它被称为检查异常,但NullPointerException未被编译器检查它称为未检查异常。但两者都是例外。正如您提到的 No, you don't want every method you ever write to have to either catch or declare NullPointerException 这就是为什么 Java 没有将其作为检查异常但 Java 可以。
    【解决方案2】:

    是的。除了ErrorRuntimeException 及其(直接或间接)子类之外,任何Throwable 都是已检查异常。

    但是,这些是由编译器检查的,而不是由JVM检查的;检查的异常是编译时功能,而不是运行时功能。 (更新:我现在看到您已经编辑了您的问题以指定“编译器”而不是“JVM”。☺)


    再详细一点。 . .好像没有任何类型的“检查异常”接口。逻辑只是硬编码:“任何异常类都是检查异常,除非它是RuntimeExceptionError 的子类型”。

    【讨论】:

      【解决方案3】:

      这是一个有用的链接:http://www.javapractices.com/topic/TopicAction.do?Id=129

      它解释了unchecked和checked之间的区别并给出了一些例子。

      “这有点令人困惑,但也要注意 RuntimeException(未选中)本身就是 Exception(选中)的子类。”

      【讨论】:

        【解决方案4】:

        根据11.1.1. 例外的种类

        异常由 Throwable 类(Object 的直接子类)或其子类之一的实例表示。

        Throwable 及其所有子类统称为异常类。

        请注意,Throwable 的子类不能是泛型的(第 8.1.2 节)。

        Exception 和 Error 类是 Throwable 的直接子类。

        异常是普通程序可能希望从中恢复的所有异常的超类。

        Error 是所有异常的超类,普通程序通常不会从中恢复。

        Error 及其所有子类统称为错误类。

        Error 类是 Throwable 的一个单独子类,与类层次结构中的 Exception 不同,它允许程序使用习语“} catch (Exception e) {”(第 11.2.3 节)来捕获从中恢复的所有异常可能不会捕获通常无法从中恢复的错误。

        RuntimeException 类是 Exception 的直接子类。 RuntimeException 是所有异常的超类,在表达式评估期间可能由于多种原因引发,但仍可能从中恢复。

        RuntimeException 及其所有子类统称为运行时异常类。

        未经检查的异常类是运行时异常类和错误类。

        已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是 Throwable 的子类,除了 RuntimeException 及其子类和 Error 及其子类。

        【讨论】:

          【解决方案5】:

          运行时异常被称为未经检查的异常,因为它在编译时未被检查。除了ERRORRuntimeException 之外的所有东西都是检查异常。在程序中添加运行时异常会降低程序的清晰度。

          class Divide {
              public static void main(String [] args){
                  int a = 10;
                  int b = 0;
                  int c = a/b; // This will throw run time exception due to unexpected value of b.
              }
          }
          

          请阅读此链接The Java™ Tutorials - Unchecked Exceptions — The Controversy

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-08
            • 1970-01-01
            • 2012-07-14
            • 2014-06-04
            • 2019-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多