An exception parameter of a uni-catch clause is never implicitly declared final, but
可能 effectively final.
可能 暗示了什么。请举例说明。
答案 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();
}