为什么我要初始化“j”?

时间:2013-06-20 18:32:40

标签: java initialization nested-loops

以下是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?当我不这样做时,代码编译时出错。

提前致谢。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

编译器将接受int j;而不进行初始化。

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

答案 2 :(得分:0)

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

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