次の形式のコードがあります。
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 スタイルのループを従来のカウント ループに置き換える
ここで何が起こっているのですか?
注:エラーを引き起こす最小限の例を取得できなかったため、「環境」(約1400 loc)に問題がある可能性があります。t
ただし、t
他のどこにも書かれていないように、の初期化を妨げる可能性のあるものはわかりません。
楽しい事実: 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
ます。それで、私はいくつかの邪悪なコーナーケースに遭遇したと思います...何か?
のいずれかを実行できることに注意してください。
- いずれかのメンバーを削除する
final
ループ内を削除A()
for
ループを通常のループに置き換えます。for ( int i=0; i<100; i++ ) { ... }
そしてそれはコンパイルされます。