Java 如何确定异常是在编译时检查还是在运行时检查?
我正在查看Java 如何确定异常是在编译时检查还是在运行时检查?,java,exception,exception-handling,Java,Exception,Exception Handling,我正在查看RuntTimeException类,它没有在编译时签入。为什么类在编译时不检查而在运行时不检查呢 RuntimeException类扩展了Exception类,但仍然未选中?怎么做 编译器如何决定是在runtime还是compile时间中检查此类 类未被检查,您在这里讨论的是异常。一个例外是编译时是否被选中。必须在可能引发已检查异常的方法的签名中捕获或声明已检查异常。未经检查的异常不需要任何特殊处理。规则如下: 扩展RuntimeException(包括RuntimeExcepti
RuntTimeException
类,它没有在编译时签入。为什么类在编译时不检查而在运行时不检查呢
RuntimeException
类扩展了Exception
类,但仍然未选中?怎么做李>
编译器如何决定是在runtime
还是compile
时间中检查此类
类未被检查,您在这里讨论的是异常。一个例外是编译时是否被选中。必须在可能引发已检查异常的方法的签名中捕获或声明已检查异常。未经检查的异常不需要任何特殊处理。规则如下:
扩展RuntimeException
(包括RuntimeException
本身)的所有异常类都是未选中的异常
扩展Exception
的所有其他类都是选中的异常-不包括RuntimeException
及其以下所有内容
错误
下面的所有内容也未选中
“Checked”表示Java编译器将检查您的代码是否通过捕获异常来处理异常,或者可能发生异常的方法是否有一个throws
子句来指示此方法可能引发这种类型的异常
请参阅Oracle的Java教程中的详细说明
这两个问题的答案都是:它是这样工作的,因为它是在Java语言规范中指定的
RuntimeException类扩展了Exception类,但仍然未选中?怎么做
这是一种设计选择。Java语言的设计者认为RuntimeException和Error以及扩展它们的类在定义上都是未经检查的异常。所以这只是语言的一条规则
编译器如何决定是在运行时还是编译时检查此类
编译器检查抛出的异常的类型。如果是RuntimeException或错误,则该异常将被取消选中。RuntimeException类扩展了exception类,但仍然被取消选中?怎么做?你说的“怎么做”是什么意思?它只是按照规则工作。这没有理由不起作用,因为RuntimeException
扩展了Exception
。该语言的规则是Error和RuntimeException,它们的子类是未检查的异常。检查所有其他异常。是的,RuntimeException
扩展了Exception
,这正是您永远不应该捕获整个异常的原因--除非您以前处理过RuntimeException
,否则Java编译器如何确定它是基于名称还是某个类定义的,该类定义使RuntimeException处于未选中状态。我是否可以在不扩展RunttimeeException的情况下创建一个类似于RuntimeException的类。@Shane是的,java编译器中的代码必须以某种方式将RuntimeException名称识别为特殊名称。不,你不能自己做这样的事情(至少不能不先在Java编译器中修改代码)@Shane不,不是这样的。未检查的异常是RuntimeException或错误。
| Throwable |
+-----------+
/ \
/ \
+-------+ +-----------+
| Error | | Exception |
+-------+ +-----------+
/ | \ / | \
\________/ \______/ \
unchecked checked
+------------------+
| RuntimeException |
+------------------+
/ | | \
\_________________/
unchecked