是否可以通过查看代码来判断异常类是已选中还是未选中?我一直认为,如果它扩展了Exception,它被检查,但是然后RuntimeException扩展了Exception并且未经检查。 RuntimeException可能是弯曲该经验法则的唯一类,其他未经检查的异常如果不扩展RuntimeException则必须扩展Throwable。但是,我没有看到RuntimeException与Exception的区别。我想知道是否在解释器本身内部定义了差异?
答案 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
不需要声明抛出任何延伸Error
或RuntimeException
的地方。错误通常只由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?
......魔法技巧是在字节码内完成的。
下面的文章通过分析字节码来显示它:
基本机制是例外表:
Exception table:
from to target type
0 4 4 <Class java.lang.ArithmeticException>
如果在执行方法期间抛出异常,Java虚拟机将在异常表中搜索匹配的条目。
如果当前程序计数器在条目指定的范围内,并且抛出的异常类是由条目指定的异常类(或者是指定异常类的子类),则异常表条目匹配。
Java虚拟机按照条目在表中的显示顺序搜索异常表。找到第一个匹配项后,Java虚拟机会将程序计数器设置为新的pc偏移位置并继续执行。
如果未找到匹配项,Java虚拟机将弹出当前堆栈帧并重新抛出相同的异常。
当Java虚拟机弹出当前堆栈帧时,它会有效地中止当前方法的执行并返回调用此方法的方法。但是,不是在前一个方法中继续正常执行,而是在该方法中抛出相同的异常,这会导致Java虚拟机经历搜索该方法的异常表的相同过程。