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

Vis*_*ant 0 java javadoc java-8

来自Java doc的声明.

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

可能意味着什么.请举例说明.

nos*_*sid 5

JLS8在4.12.4节中说明:

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

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

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

在下面的示例中,变量e 有效最后,因为有一个分配给该变量.这意味着,它不能在lambda表达式匿名内部类中使用:

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