在 Java 7 之前的版本中捕获 Java 中的(异常 e)

Catch (Exception e) in Java in versions earlier than Java 7

在 Oracle OCP Java SE 8 Programmer II 学习指南的第 3 章中,它说了以下内容(第 184 页):

在Java6中,我们不能写成catch (Exception e)而仅仅抛出特定的异常。如果我们尝试,编译器仍然会报错:

未处理的异常类型 Exception

这是什么意思?具体例子是什么?

考虑以下示例:

Integer add (Integer a, Integer b) {
    try {
        return a + b;
    } catch (Exception e) {
        throw e;
    }
}

当然,两个数相加不能抛出任何检查异常。然而,在 Java 6 中,编译器看到 throw e,其中 e 是一个 Exception,并得出结论该方法可以抛出任何 Exception。这需要添加声明它 throws Exception.

从 Java 7 开始,编译器更聪明地计算出异常 e 在重新抛出时可能是什么类型。在这种情况下,可以计算出 e 只能是 RuntimeException (未选中),因此不再需要添加 throws Exception 的声明。