如何确定异常是编译时检查还是运行时检查?

时间:2014-12-11 14:11:00

标签: java exception exception-handling

我正在查看RuntTimeException类,并且未在编译时检查。为什么一个类在编译时不是checked而在运行时不是checked

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

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

                   unchecked
  1. RuntimeException类扩展Exception类但仍未选中?怎么样?。
  2. 编译器如何决定是否应在runtimecompile时间内检查此类?

3 个答案:

答案 0 :(得分:1)

未检查类,您在此处讨论异常。编译时是选中还是未选中是一个例外。必须在可能抛出的方法的签名中捕获或声明已检查的异常。未经检查的例外不需要任何特殊处理。

答案 1 :(得分:1)

规则如下:

  1. 扩展RuntimeException(包括RuntimeException本身)的所有异常类都是未选中例外。
  2. 扩展Exception的所有其他类都是已选中例外 - 不包括RuntimeException以及其后的所有内容。
  3. Error以及下面的所有内容也未经检查。
  4. "经过"意味着Java编译器将检查您的代码是通过捕获它来处理异常,还是可能发生异常的方法具有throws子句以指示此方法可能抛出此类异常。

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

    你的两个问题的答案是:它的工作原理是这样的,因为它的定义与Java语言规范中的相同。

答案 2 :(得分:1)

  

RuntimeException类是否扩展了Exception类但仍未选中?怎么样?

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

  

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

编译器检查抛出的异常的类型。如果是RuntimeException或Error,则取消选中该异常。