uni-catch的异常参数可能有效最终?

时间:2014-03-29 14:00:54

标签: java javadoc java-8

来自Java doc.

的陈述

An exception parameter of a uni-catch clause is never implicitly declared final, but 可能 effectively final.

可能 暗示了什么。请举例说明。

1 个答案:

答案 0 :(得分:5)

JLS8在4.12.4部分中说明:

  

如果局部变量或方法,构造函数,lambda或异常参数未声明为final,则它实际上是final,但它永远不会作为赋值运算符的左手操作数(第15.26节)或作为前缀的操作数发生或后缀增量或减量运算符(§15.14,§15.15)。

在以下示例中,变量e有效最终。这意味着它可以在 lambda表达式匿名内部类中使用:

try {
    throw new RuntimeException("foobar");
} catch (RuntimeException e) {
    Runnable r = () -> { System.out.println(e); };
    r.run();
}

在以下示例中,变量e 有效最终,因为存在对该变量的赋值。这意味着,它不能在 lambda表达式匿名内部类中使用:

try {
    throw new RuntimeException("foo");
} catch (RuntimeException e) {
    e = new RuntimeException("bar", e);
    Runnable r = () -> { System.out.println(e); }; // ERRROR
    r.run();
}