我有以下形式的代码:
class Test {
private final A t;
public Test() {
for ( ... : ... ) {
final A u = null;
}
t = new A();
}
private class A {}
}
编译器提示:
variable t might already have been assigned
有趣的是,如果我对循环进行以下任何更改,它就可以正常工作!
更改循环内容为
A u = null
删除整个循环(但保留 final A u = null;
)用传统的计数循环替换foreach-style循环
这里发生了什么?
注意:我无法让最小示例引发错误,因此“环境”(约1400个loc)可能有问题。 但是,我看不出会干扰
t
的初始化的原因,因为t
没有被写入任何其他地方。有趣的事实:如果我移除final修饰符,IntelliJ IDEA会说“变量'u'可以有'final'修饰符...”。
我使用javac 1.6.0_26。
更新:这是一个非常简单的示例:
import java.util.List;
class A {
private final boolean a;
public A() {
for ( final Object o : new Object[] {} ) {
final Object sh = null;
}
a = true;
}
class B {
private final Object b1;
private final Object b2;
B() {
b1 = null;
b2 = null;
}
}
}
在javac 1.6.0_26
上无法编译,但在javac 1.7.0_02
上可以。所以我想我遇到了一些奇怪的边角情况,还是什么问题吗?
请注意,您可以执行以下任何操作:
- 删除任何一个成员
- 在
A()
中移除循环内的final
- 用普通的
for
循环替换循环,例如for ( int i=0; i<100; i++ ) { ... }
它将会被编译。
mvn install
命令;我们的项目没有定义编译器参数(据我所知)。 - Raphael