Java - checked vs unchecked异常 - 仅从代码中说出来?

Mic*_*ord 6 java unchecked-exception

是否可以通过查看代码来判断异常类是经过检查还是未经检查?我一直认为,如果它扩展了Exception,则会进行检查,但是RuntimeException会扩展Exception并且取消选中.RuntimeException可能是弯曲该经验法则的唯一类,其他未经检查的异常如果不扩展RuntimeException则必须扩展Throwable.但是,我没有看到RuntimeException与Exception的区别.我想知道是否在解释器本身内部定义了差异?

Ste*_*n C 2

是否可以仅通过查看代码来判断异常类是已检查还是未检查?

是的。如果您知道 JLS ( 11.1.1 )中指定的规则...并且您还可以查看异常的超类的代码(以便您可以检查层次结构)。

规则是“检查”例外情况,但以下情况除外:

  • RuntimeException及其子类,以及

  • Error及其子类,

这是“未经检查的”。

我想知道差异是否是在解释器本身内部定义的?

不,它包含在 Java 语言规范中。事实上,JVM 对检查异常和非检查异常的处理方式是一样的。所有检查异常是否被正确处理的检查都是由 Java 编译器完成的。


但是,我仍然不明白 RuntimeException 扩展 Exception 而不是 Throwable 的推理。鉴于 RuntimeException 中没有任何内容可以覆盖 Exception 中定义的行为,这种设计选择似乎是矛盾的。

事情就是这样。此外,我没有看到任何逻辑矛盾。

  • AnError代表不可恢复的状况。它是未经检查的,因为没有必要强制应用程序对此执行某些操作。

  • AnException代表潜在可恢复的状况。

  • ARuntimeException表示我们不想强制应用程序处理的潜在可恢复情况。(但如果它愿意的话,它可以)。

显然,根据这种分类法,a RuntimeException>>is<< anException且 >>not<< an Error...,这就是以这种方式定义异常类层次结构的基本原理。