为啥运行时异常是未经检查的异常?

Posted

技术标签:

【中文标题】为啥运行时异常是未经检查的异常?【英文标题】:Why runtime exception is unchecked exception?为什么运行时异常是未经检查的异常? 【发布时间】:2012-07-17 20:59:29 【问题描述】:

一般来说,如果任何类扩展 Exception ,它就会变成检查异常。 Runtime exception 也扩展了异常。那unchecked exception怎么样?

他们是否在编译器中针对这种特殊情况进行了自定义检查?

编辑:我对 checked v/s unchecked exception 及其优缺点等有正确的认识。我不接受差异他们之间的回答。

【问题讨论】:

【参考方案1】:

规范中有明确规定,@​​987654321@:

RuntimeException 及其所有子类统称为运行时异常类

未经检查的异常类是运行时异常类和错误类。

已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是 Throwable 的子类,除了 RuntimeException 及其子类和 Error 及其子类。

所以是的,编译器肯定知道RuntimeException

【讨论】:

为什么我们不能检查运行时异常?我们知道可能有一个 NullPointerException 那么我们应该检查它。有什么想法吗? @UnKnown:不,您不希望您编写的每个方法都必须捕获或声明 NullPointerException ......那太糟糕了。 从概念上讲,已检查和未检查的异常没有区别?只是实现有所不同? @UnKnown:这取决于你所说的“概念上”到底是什么意思。 由于FileNotFoundException被编译器检查,所以它被称为检查异常,但NullPointerException未被编译器检查它称为未检查异常。但两者都是例外。正如您提到的 No, you don't want every method you ever write to have to either catch or declare NullPointerException 这就是为什么 Java 没有将其作为检查异常但 Java 可以。【参考方案2】:

是的。除了ErrorRuntimeException 及其(直接或间接)子类之外,任何Throwable 都是已检查异常。

但是,这些是由编译器检查的,而不是由JVM检查的;检查的异常是编译时功能,而不是运行时功能。 (更新:我现在看到您已经编辑了您的问题以指定“编译器”而不是“JVM”。☺)


再详细一点。 . .好像没有任何类型的“检查异常”接口。逻辑只是硬编码:“任何异常类都是检查异常,除非它是RuntimeExceptionError 的子类型”。

【讨论】:

【参考方案3】:

这是一个有用的链接:http://www.javapractices.com/topic/TopicAction.do?Id=129

它解释了unchecked和checked之间的区别并给出了一些例子。

“这有点令人困惑,但也要注意 RuntimeException(未选中)本身就是 Exception(选中)的子类。”

【讨论】:

【参考方案4】:

根据11.1.1. 例外的种类

异常由 Throwable 类(Object 的直接子类)或其子类之一的实例表示。

Throwable 及其所有子类统称为异常类。

请注意,Throwable 的子类不能是泛型的(第 8.1.2 节)。

Exception 和 Error 类是 Throwable 的直接子类。

异常是普通程序可能希望从中恢复的所有异常的超类。

Error 是所有异常的超类,普通程序通常不会从中恢复。

Error 及其所有子类统称为错误类。

Error 类是 Throwable 的一个单独子类,与类层次结构中的 Exception 不同,它允许程序使用习语“ catch (Exception e) ”(第 11.2.3 节)来捕获从中恢复的所有异常可能不会捕获通常无法从中恢复的错误。

RuntimeException 类是 Exception 的直接子类。 RuntimeException 是所有异常的超类,在表达式评估期间可能由于多种原因引发,但仍可能从中恢复。

RuntimeException 及其所有子类统称为运行时异常类。

未经检查的异常类是运行时异常类和错误类。

已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是 Throwable 的子类,除了 RuntimeException 及其子类和 Error 及其子类。

【讨论】:

【参考方案5】:

运行时异常被称为未经检查的异常,因为它在编译时未被检查。除了ERRORRuntimeException 之外的所有东西都是检查异常。在程序中添加运行时异常会降低程序的清晰度。

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.
    

请阅读此链接The Java™ Tutorials - Unchecked Exceptions — The Controversy

【讨论】:

以上是关于为啥运行时异常是未经检查的异常?的主要内容,如果未能解决你的问题,请参考以下文章

十大运行时异常(隐式)

常见JAVA运行时异常有哪些?

检查时异常和运行是异常 + 事务回滚

如何包装检查的异常但在 Java 中保留原始运行时异常

常见的运行时异常(RuntimeExecption)

运行时/已检查/未检查/错误/异常之间的差异