如果从java中删除已检查的异常会发生什么?

时间:2013-01-01 01:32:24

标签: java exception

我接受了这次采访 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 个答案:

答案 0 :(得分:4)

实际上并不会发生太多事情。在VM级别,未选中所有异常。您可以通过执行此操作来验证此以下内容:

public class A {
    public static void a() {
        /* Do nothing */
    }
}

public class B {
    public static void main(String[] args) {
        A.a();
    }
}

将这些类存储在各自的文件A.javaB.java中并进行编译。然后,将A更改为以下内容:

public class A {
    public static void a() throws Exception {
        throw(new Exception("foo"));
    }
}

重新编译A.java而不重新编译B.java。然后运行B,您将看到来自A的抛出异常传播并终止该程序,就像它是RuntimeException一样,没有VM抱怨链接错误或其他任何内容。

经过检查的异常仅仅是Java语言的语法级功能。删除它不会影响VM实现甚至语言模型。

答案 1 :(得分:1)

  

我想知道如果删除已检查的异常机制会怎么样?

简短的回答是,技术层面 1 不会发生任何事情。

然而,大量的Java程序员会认为检查异常实际上是好东西 ......或者至少,他们比单纯的替代方案更好。消除区别。

过去15年来负责Java语言创建演变的人们采取了一种基本上保守的方法,只做了向后兼容的变更,并且只有在广泛接受这是一件好事时才会这样做。因此,虽然删除已选中/未选中的区别是一个“有趣”的提议,但它不太可能发生在Java(IMO)中。


1 - 理论上可能存在编译器上的功能依赖的代码或者将错误处理的异常检查异常标记为错误的东西......但我从未遇到过这样的情况这有意义。

答案 2 :(得分:0)

检查的异常仅在Java编译器中有意义-JVM不会区分检查/未检查的异常。因此,Oracle可以两种方式使用它们,它们可以提供一个编译器参数来控制对已检查异常的处理,例如:

-Xchecked-exception-handling: (neutral|throws|strict)

我不确定Oracle是否考虑过这种策略。我只读过有关“或/或”命题的信。

无论如何,在此之前,您都可以使用Manifold编译器插件来实现相同的目标:中和已检查的异常。启用例外插件选项后,已检查的异常的行为与未检查的异常完全相同。不再尝试/捕获/包装/重新放置样板废话,不再无意地吞下异常,不再有lambda使用冲突。