3

Javaが変数の初期化と単純な宣言を必要とする場合を理解するための何かが欠けている場合、私はより深いレベルで理解しようとしています。次のコードでは、変数'row'に値を割り当ててコンパイルおよび実行する必要はありませんが、変数'column'に値を割り当てる必要があります。

注:このプログラムは何の役にも立ちません。人々の貴重な時間を無駄にしないように、この質問に必要なものだけを表示するように調整されています。

コードスニペットは次のとおりです。

int row;      //row doesn't need initialization
int column=0; //column does need initialization
for (row=0; row<2; row++){
    for (column=0; column<2; column++){
    }
}
System.out.print("Col:" + column + " row:" + row);

なぜrow上部に初期化なしでコンパイルするのに、Javaはcolumn「初期化されていない可能性がある」と考えているのですか?

4

3 に答える 3

5

row = 0(外部ループから)は評価されることが保証されているため、row変数は常に使用前に初期化されます。column変数は、外部ループが少なくとも1回繰り返される場合にのみ、初期化されます。言い換えると、column = 0(内部ループからの)式は評価されることが保証されていません。

于 2012-04-09T02:18:31.720 に答える
4

rowcolumn変数の両方をで使用する前にSystem.out.println、それらを初期化する必要があります。 rowは外側のループで初期化されるので問題ありませんが、列は内側のループで初期化され、コンパイラーはこれが実行されるとは想定していません(実際には実行されますが)。

于 2012-04-09T02:18:43.247 に答える
2

Javaコンパイラはコードを追跡できません。それはcolumn外側のforループの本体の内部で初期化されることを確認しますが、そのコードが実行されることを確認する方法はありません。したがって、への呼び出しで変数にアクセスする前に、変数が常に初期化されるかどうかを確認することはできませんprint

一方、外部forループの初期化ステートメントは、何があっても実行されることが保証されていることを知っています。したがって、それがrow初期化されることを保証できます。

于 2012-04-09T02:18:53.770 に答える