【问题标题】:How to determe if exception is compile time checked or runtime checked?如何确定异常是编译时检查还是运行时检查?
【发布时间】:2014-12-11 14:10:59
【问题描述】:

我正在查看RuntTimeException 类,它没有在编译时检查。为什么一个类在编译时不是checked 而在运行时不是checked?

https://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html

               | Throwable |
               +-----------+
                /         \
               /           \
      +-------+          +-----------+
      | Error |          | Exception |
      +-------+          +-----------+
       /  |  \           / |        \
     \________/        \______/      \
      unchecked                   checked
                +------------------+
                | RuntimeException |
                +------------------+
                  /   |    |      \
                \_________________/

                   unchecked
  1. RuntimeException class 扩展 Exception class 并且仍然未选中?如何?。
  2. 编译器如何决定是否应在runtime 或compile 时间检查此类?。

【问题讨论】:

    标签: java exception exception-handling


    【解决方案1】:

    RuntimeException 类扩展了 Exception 类并且仍然未选中?怎么样?

    这是一种设计选择。 Java 语言的设计者决定 RuntimeException 和 Error 以及扩展它们的类根据定义是未经检查的异常。所以这只是语言的规则。

    编译器如何决定这个类是在运行时检查还是在编译时检查?

    编译器检查所​​抛出异常的类型。如果是 RuntimeException 或 Error,则未检查异常。

    【讨论】:

    • Java 编译器如何根据名称或某些类定义来决定是否使 RuntimeException 未选中。我可以在不扩展 RunttimeException 的情况下创建一个类似于 RuntimeException 的类吗?
    • @Shane 是的,java 编译器中的代码必须以某种方式将名称 RuntimeException 识别为特殊的。不,你不能自己做这样的事情(至少在不先更改 Java 编译器中的代码的情况下不能)
    • @Shane 不,不是。未经检查的异常是 RuntimeException 或 Error。
    【解决方案2】:

    规则如下:

    1. 所有扩展 RuntimeException 的异常类(包括 RuntimeException 本身)都是未经检查的异常。
    2. 所有其他扩展 Exception 的类都是已检查例外 - 不包括 RuntimeException 及其以下的所有内容。
    3. Error 以及下面的所有内容也未选中。

    “已检查”表示 Java 编译器将检查您的代码是否通过捕获异常来处理它,或者可能发生异常的方法是否具有 throws 子句来指示此方法可能会抛出这种类型的例外。

    请参阅 Oracle 的 Java 教程中的 The Catch or Specify Requirement,其中详细解释了这一点。

    这两个问题的答案是:它的工作原理是这样的,因为它在 Java 语言规范中是这样指定的。

    【讨论】:

    • RuntimeException 类扩展了 Exception 类并且仍然未选中?怎么样?
    • “如何”是什么意思?它只是按照规则工作。没有理由这不应该工作,因为RuntimeException 扩展了Exception。
    • 语言的规则是Error和RuntimeException,它们的子类是未经检查的异常。所有其他例外都已检查。
    • 是的,RuntimeException 扩展 Exception 的事实正是您永远不应该“完整地”捕获 Exception 的原因——除非您之前处理过 RuntimeException
    【解决方案3】:

    一个类没有被检查,你在这里谈论异常。一个例外是编译时检查还是未检查。必须在可能抛出它的方法的签名中捕获或声明已检查的异常。未经检查的异常不需要任何特殊处理。

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 2023-04-08
      • 2015-12-04
      • 2019-06-24
      • 2020-01-07
      • 2018-05-09
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多