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

时间:2014-03-14 12:55:12

标签: java unchecked-exception

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

8 个答案:

答案 0 :(得分:4)

RuntimeException及其子类是未经检查的异常。所有其他人都是经过检查的例外情况。

答案 1 :(得分:2)

您可以在Java Tutorials(强调我的)中找到未经检查的例外的定义:

  

... Java编程语言不需要捕获或指定未经检查的异常的方法(RuntimeException,Error及其子类) ...

答案 2 :(得分:2)

  

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

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

规则是除了以下内容以外的“检查”

  • RuntimeException及其子类和

  • Error及其子类

是“未选中”。

  

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

没有。它在Java语言规范中。实际上,JVM将已检查和未检查的异常视为相同。所有检查异常的检查都是由Java编译器完成的。


  

但是,我仍然不理解RuntimeException扩展Exception而不是Throwable的原因。鉴于RuntimeException中没有任何内容覆盖Exception中定义的行为,该设计选择似乎是矛盾的。

就是这样。此外,我认为没有任何逻辑矛盾。

  • Error代表不可恢复的条件。它是未经检查的,因为没有必要强迫应用程序对它做些什么。

  • Exception表示潜在的可恢复条件。

  • RuntimeException表示我们不希望强制应用程序处理的潜在可恢复条件。 (但它可以,如果它想)。

显然,通过这种分类,RuntimeException>>是<<一个Exception和>>不是<< Error ...这就是以这种方式定义异常类层次结构的基本原理。

答案 3 :(得分:1)

而不是"抓住与未捕获" ,而不是"已检查与未检查" 例外。 在编译时检查的异常是受控制的,即如果某些东西不符合异常合同,编译器会发出警告,但是在运行时可以抛出未经检查的异常。

答案 4 :(得分:0)

如果你使用IDE是最简单的方法,如果你的IDE给你一个错误/下划线,告诉你如果你没有抓住它就有一个未处理的异常。这些是例外情况。

或者,取消选中从RuntimeException继承的任何内容。

答案 5 :(得分:0)

Throwable的继承树实际上是:

Throwable     Error
              Exception   RuntimeException

不需要声明抛出任何延伸ErrorRuntimeException的地方。错误通常只由JVM引发,并发出非常糟糕的信号。

需要声明任何扩展Exception但不扩展RuntimeException的内容。一般来说Exceptions是调用代码应该处理或考虑的事情(例如"无法打开文件")而RuntimeExceptions是可能表示错误的事情。代码或损坏的数据,例如NullPointerException,因此调用代码不太可能对此做任何事情。

答案 6 :(得分:0)

如果您使用throws exception显式的任何方法或代码,则需要捕获该异常,并且通过查看代码,我们确定需要捕获,以便检查Exception。如果RuntimeException通过查看代码,您无法保证此代码将抛出异常,因此它们未经检查。

Java doc reference

  

方法抛出的任何异常都是方法的公共编程接口的一部分。那些调用方法的人必须知道方法可以抛出的异常,以便他们可以决定如何处理它们。这些异常是该方法的编程接口的一部分,作为其参数和返回值。

答案 7 :(得分:0)

正如javadoc所说:

  

RuntimeException是可以使用的那些异常的超类   在Java虚拟机的正常操作期间抛出。一个   方法不需要在其throws子句中声明任何子类   可能在执行期间抛出的RuntimeException   方法但没有抓到。

     

作者:Frank Yellin

     

自:JDK1.0

现在,回到你的问题,I wonder if the difference is defined inside the interpreter itself? ......魔法技巧是在字节码内完成的。

下面的文章通过分析字节码来显示它:

http://www.javaworld.com/article/2076868/learn-java/how-the-java-virtual-machine-handles-exceptions.html

基本机制是例外表

Exception table:
   from   to  target type
     0     4     4   <Class java.lang.ArithmeticException>

如果在执行方法期间抛出异常,Java虚拟机将在异常表中搜索匹配的条目。

如果当前程序计数器在条目指定的范围内,并且抛出的异常类是由条目指定的异常类(或者是指定异常类的子类),则异常表条目匹配。

Java虚拟机按照条目在表中的显示顺序搜索异常表。找到第一个匹配项后,Java虚拟机会将程序计数器设置为新的pc偏移位置并继续执行。

如果未找到匹配项,Java虚拟机将弹出当前堆栈帧并重新抛出相同的异常。

当Java虚拟机弹出当前堆栈帧时,它会有效地中止当前方法的执行并返回调用此方法的方法。但是,不是在前一个方法中继续正常执行,而是在该方法中抛出相同的异常,这会导致Java虚拟机经历搜索该方法的异常表的相同过程。