我经历了这次采访
http://www.artima.com/intv/handcuffs.html
和一些关于检查异常的文章和讨论。那checked exception
就是引入java的未经尝试的实验。它会带来版本性和可扩展性问题。Bruce eckel 还提供了一个适配器来转换checked exception
,unchecked exception
以避免调用强制捕获异常。我的心也冬眠checked exception
了unchecked exception
。我想知道如果我们删除checked exception
机制会怎样?我也同意checked exception
没有必要存在。
3 回答
实际上不会发生很多事情。在 VM 级别上,所有异常都未选中。您可以通过执行以下操作来验证这一点:
public class A {
public static void a() {
/* Do nothing */
}
}
public class B {
public static void main(String[] args) {
A.a();
}
}
将这些类存储在它们各自的文件中A.java
并B.java
编译它们。然后,更改A
为以下内容:
public class A {
public static void a() throws Exception {
throw(new Exception("foo"));
}
}
重新编译A.java
而不重新编译B.java
。然后运行B
,您将看到A
传播和终止程序所引发的异常,就好像它是 a 一样RuntimeException
,而 VM 不会抱怨链接错误或任何东西。
已检查异常只是 Java 语言的语法级特性。删除它不会影响 VM 的实现,甚至不会影响语言模型。
我想知道如果我们删除检查异常机制会怎样?
简短的回答是,在技术层面1不会发生任何事情。
然而,大量 Java 程序员会发出长期而响亮的抱怨,他们认为检查异常实际上是一件好事……或者至少,它们比简单地删除区别要好。
在过去 15 年多的时间里,负责 Java 语言创造演变的人们采取了一种本质上保守的方法,只进行向后兼容的更改,并且只有在广泛接受这是一件好事时才进行。因此,虽然删除已检查/未检查的区别是一个“有趣”的提议,但它不太可能在 Java (IMO) 中发生。
1 - 理论上可能存在功能取决于编译器的代码或将错误处理的检查异常标记为错误的代码......但我从未遇到过这样的情况。
已检查的异常仅在 Java 编译器中有意义——JVM 不区分已检查/未检查的异常。因此 Oracle 可以有两种方式,他们可以提供编译器参数来控制检查异常的处理,例如:
-Xchecked-exception-handling: (neutral|throws|strict)
我不确定甲骨文是否考虑过这种策略;我只读过关于非此即彼的命题。
无论如何,在那之前,您可以使用Manifold编译器插件来实现相同的目标:中和已检查的异常。启用异常插件选项后,检查异常的行为与未检查异常完全相同。不再有 try/catch/wrap/rethrow 样板废话,不再有无意的异常吞噬,不再有 lambda 使用冲突。