检查异常非常强大,因为它们允许您强制使用点处理异常情况。如果使用点不处理异常情况(或公开宣布不处理),则代码将无法编译。
但是,这是编译时。运行时怎么样?
运行时检查异常和未检查异常之间是否存在任何有意义的区别?
我唯一能想到的是未经检查的异常扩展RuntimeException
,但我没有看到任何RuntimeException
允许它在运行时被区别对待的属性。
检查异常非常强大,因为它们允许您强制使用点处理异常情况。如果使用点不处理异常情况(或公开宣布不处理),则代码将无法编译。
但是,这是编译时。运行时怎么样?
运行时检查异常和未检查异常之间是否存在任何有意义的区别?
我唯一能想到的是未经检查的异常扩展RuntimeException
,但我没有看到任何RuntimeException
允许它在运行时被区别对待的属性。
检查异常是 Java语言的一个特性,只由编译器强制执行。Java虚拟机根本不会强制执行它们。
为了针对已编译的库进行编程,该
throws
子句仍记录在已编译的类文件中。但在描述数据含义时,JVM 规范指出:通过滥用泛型,你可以欺骗编译器抛出任何你想要的异常,无论你在哪里:
输出:
此外,反射方法
Class.newInstance()
已被弃用,因为由于设计缺陷,它会重新抛出类的构造函数抛出的任何已检查异常,而无需包装或声明它:我认为 JVM 不会对此进行区分。例如,try-with-resources 语句实际上由 Java 编译器创建一个 throw Throwable 语句。