0

docs.oracleのコード例を次に示します。

class BreakWithLabelDemo {
public static void main(String[] args) {

    int[][] arrayOfInts = { 
        { 32, 87, 3, 589 },
        { 12, 1076, 2000, 8 },
        { 622, 127, 77, 955 }
    };
    int searchfor = 12;

    int i;
    int j = 0;
    boolean foundIt = false;

search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length;
             j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }

    if (foundIt) {
        System.out.println("Found " + searchfor + " at " + i + ", " + j);
    } else {
        System.out.println(searchfor + " not in the array");
    }
}}

ここに私の質問があります: ネストされた for ループが実行される前に変数 j を初期化する必要があるのはなぜですか? そうしないと、コードはエラーでコンパイルされます。

前もって感謝します。

4

3 に答える 3

2

arrayOfInts.length0 の場合、j初期化されません。常に初期化されるとコンパイラが判断するjには、最初のループの条件を定数式にする必要があります。たとえば、外側のループを次のように置き換えると:

for (i = 0; true; i++)

コンパイラは初期化なしで受け入れint j;ます。

詳細なルールはJLS #16で定義されています。特に、jprint ステートメントで使用する前に、確実に割り当てる必要があります。

于 2013-06-20T18:36:02.557 に答える