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)