Java 为什么运行时异常是未检查的异常?
通常,如果任何类扩展了Java 为什么运行时异常是未检查的异常?,java,exception,runtimeexception,Java,Exception,Runtimeexception,通常,如果任何类扩展了异常,它将成为选中异常运行时异常还扩展了异常。那么它是如何未经检查的异常的 对于这种特殊情况,他们是否有一个自定义检入编译器 编辑:我对已检查的v/s未检查的异常及其利弊等有正确的想法。我不接受他们在回答中的差异 是的。除了错误、运行时异常及其(直接或间接)子类之外,任何可丢弃的都是选中的异常 但是,这些是由编译器检查的,而不是由JVM检查的;选中的异常是编译时功能,而不是运行时功能。(更新:我现在看到您已将问题编辑为指定“编译器”而不是“JVM”。☺) 更详细地说,它不
异常
,它将成为选中异常<代码>运行时异常还扩展了异常。那么它是如何未经检查的异常的
对于这种特殊情况,他们是否有一个自定义检入编译器
编辑:我对已检查的v/s未检查的异常及其利弊等有正确的想法。我不接受他们在回答中的差异 是的。除了
错误
、运行时异常
及其(直接或间接)子类之外,任何可丢弃的
都是选中的异常
但是,这些是由编译器检查的,而不是由JVM检查的;选中的异常是编译时功能,而不是运行时功能。(更新:我现在看到您已将问题编辑为指定“编译器”而不是“JVM”。☺)
更详细地说,它不像是任何类型的“检查异常”接口。逻辑只是硬编码:“任何异常类都是检查异常,除非它是
RuntimeException
或Error
”的子类型。这里有一个有用的链接:
它解释了未检查和已检查之间的区别,并给出了一些示例
“这有点令人困惑,但请注意RuntimeException(未选中)本身就是Exception(已选中)的一个子类。”它在规范中明确指出:
RuntimeException
及其所有子类统称为运行时异常类
未选中的异常类是运行时异常类和错误类
选中的异常类是除未选中异常类之外的所有异常类。也就是说,选中的异常类是除RuntimeException及其子类和Error及其子类之外的所有Throwable子类
因此,是的,编译器根据异常的类型明确地知道运行时异常
异常由Throwable类(Object的直接子类)或其子类之一的实例表示
Throwable及其所有子类统称为异常类
请注意,Throwable的子类不得为泛型(§8.1.2)
Exception和Error类是Throwable的直接子类
异常是普通程序可能希望从中恢复的所有异常的超类
Error是所有异常的超类,普通程序通常不希望从中恢复
Error及其所有子类统称为Error类
类错误是Throwable的一个独立子类,与类层次结构中的异常不同,它允许程序使用惯用语“}catch(Exception e){”(§11.2.3)捕获所有可能恢复的异常,而不捕获通常不可能恢复的错误
类RuntimeException是Exception的一个直接子类。RuntimeException是所有异常的超类,这些异常在表达式求值期间可能由于多种原因引发,但仍然可以从中恢复
RuntimeException及其所有子类统称为运行时异常类。
未检查的异常类是运行时异常类和错误类。
选中的异常类是除未选中异常类之外的所有异常类。也就是说,选中的异常类是除RuntimeException及其子类和Error及其子类之外的所有Throwable子类。运行时异常称为未选中异常,因为它在编译时未被选中。除了
ERROR
和RuntimeException
之外,throwable下的所有内容都被选中为异常。在程序中添加运行时异常将降低程序的清晰度
class Divide {
public static void main(String [] args){
int a = 10;
int b = 0;
int c = a/b; // This will throw run time exception due to unexpected value of b.
}
}
请阅读此链接为什么我们不能检查运行时异常?因为我们知道可能存在NullPointerException,所以我们应该检查它。有什么想法吗?@UnKnown:不,你不希望你编写的每个方法都必须捕获或声明NullPointerException…那太糟糕了。这意味着从概念上讲,检查和声明之间没有区别还有未检查的异常?只是实现有区别?@UnKnown:这取决于你所说的“概念上”是什么意思真的。正如编译器检查的
FileNotFoundException
一样,它被称为检查异常,但编译器不检查NullPointerException,它被称为未检查异常。但两者都是异常。正如您提到的否,您不希望您编写的每个方法都必须捕获或声明NullPointerException
这就是为什么Java没有将其作为检查异常,但Java可以。