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在顶部编译 w/o 初始化,但 Java 认为column“可能尚未初始化。”?

4

3 回答 3

5

保证表达式row = 0(来自外部循环)被评估,因此row变量在使用之前总是会被初始化。column当且仅当外部循环至少迭代一次时,该变量才会被初始化。换句话说,保证会评估表达式column = 0(来自内部循环) 。

于 2012-04-09T02:18:31.720 回答
4

在 Therowcolumn变量都在 中使用之前System.out.println,需要对它们进行初始化。 row在外循环中初始化,所以很好,但列在内循环中初始化,编译器不假设它会运行(即使它在实践中会运行)。

于 2012-04-09T02:18:43.247 回答
2

Java 编译器无法遵循您的代码。它看到它column在外部for循环的主体内被初始化,但无法确定该代码是否会运行。因此,不能确定您的变量在调用print.

另一方面,它知道外for循环的初始化语句无论如何都保证运行。所以它可以保证row会被初始化。

于 2012-04-09T02:18:53.770 回答