Java 7 - 精确重新抛出最终异常

dog*_*ane 22 java final exception java-7

在以前的java版本中,重新抛出异常被视为抛出catch参数的类型.

例如:

public static void test() throws Exception{
    DateFormat df = new SimpleDateFormat("yyyyMMdd");
    try {
        df.parse("x20110731");
        new FileReader("file.txt").read();
    } catch (Exception e) {
        System.out.println("Caught exception: " + e.getMessage());
        throw e;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Java 7中,如果声明异常,则可以更精确地了解抛出的异常final:

//(doesn't compile in Java<7)
public static void test2() throws ParseException, IOException{
    DateFormat df = new SimpleDateFormat("yyyyMMdd");
    try {
        df.parse("x20110731");
        new FileReader("file.txt").read();
    } catch (final Exception e) {
        System.out.println("Caught exception: " + e.getMessage());
        throw e;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:文档说我需要声明异常final.但如果我不这样做,上面的代码仍然编译和工作.我错过了什么吗?

参考文献:

项目硬币:多次捕获和最终重新抛出为重新抛出的
异常添加更灵活的检查

Jon*_*eet 24

相信我看到Josh Bloch发来的一条推文说,"最后"的限制已被提升.我会看看我是否能找到一篇关于它的帖子,但我怀疑你所阅读的任何"早期"文档现在都是不准确的.

编辑:我找不到确切的"它已更改"帖子,但Java 7文档状态显示了一个例子,它不是最终的.当catch块声明多个类型时,它会讨论异常变量是隐式最终的,但这稍微是分开的.

编辑:现在我已经找到了我的问题的根源,但它是一个内部的邮件列表后:(无论如何,它并没有被声明为final的,但我相信,编译器将其视为隐含最后的-就像在多捕捉场景.

  • 嘿@ jon-skeet,我知道它是一个+ 1y的老帖子,但是最后一次编辑还有一件事:在这种情况下,如果`e`没有被声明为'final`,编译器**将不会**_implicitly_对待它作为'final`(如多重捕获).但是,如果更改了`e`引用,那么`throws`子句中必须包含`Exception`. (6认同)