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

4

您必须进行初始化,因为编译器在最终语句中访问它之前j不知道它是否会在内部循环中被初始化。forif

就编译器而言,外部for循环的主体可能不会被执行。

于 2013-06-20T18:34:22.550 回答
2

如果arrayOfInts.length为 0,j则不会被初始化。为了让编译器确定j将始终初始化,您需要第一个循环的条件是一个常量表达式。例如,如果将外部循环替换为:

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

编译器int j;无需初始化即可接受。

详细规则在JLS #16中定义。特别是,j在您的打印语句中使用之前需要明确分配。

于 2013-06-20T18:36:02.557 回答
0

因为您j在 for 循环之外使用。

特别是,您在代码底部的打印语句中使用它。

于 2013-06-20T18:34:19.450 回答