が、私はこれをコンパイルされたコードJavaコンパイラがフィールドの初期化を認識しないのはなぜですか?
int myVar;
final boolean condition = <someCondition>;
if (condition) {
myVar = 1;
}
if (condition) {
System.out.println("myVar = " + myVar);
}
の以下の部分があると、私はmyVar might not have been initialized
エラーを予想ました。 これはコンパイラのバグですか? condition
がtrueのときに "myVar"が設定されていて、condition
がtrueのときにのみ参照されることは容易に分かります。 (condition
も決してリセットされません)
P.S:0に初期化する必要がある私のコメントに、はい私はそれを認識しています。 (。つまり、値は高々一度設定)が、ポイントは、私が「myVarに」最終的なものにするJLSで説明したように、
:コンパイラは、したがって、次の文でエラーを報告する義務があります初期化が必要です。 – azurefrog
Javaコンパイラは、変数myVarが使用される前に常に値が変数myVarに割り当てられていると結論付けるのに十分深い分析をしません。一般に、異なる条件文で条件を相関させようとはしません。 –
コンパイラが条件が変わらないことを認識しているとは思わない。例えば、これは中断されたCPU上で実行されます。これを実行するに戻ると状態が変わることがあります。 心配しないで、私は状態の宣言を見ていませんでした。 @ジョン・ボリンジャーが十分であると思われるもの。 – bhow