我试图在更深层次上理解我是否缺少了解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
“可能尚未初始化。”?
答案 0 :(得分:5)
保证表达式row = 0
(来自外部循环),因此row
变量将在使用前始终初始化。当且仅当外循环至少迭代一次时,才会初始化column
变量。换句话说,表达式column = 0
(来自内部循环) 保证不会被评估。
答案 1 :(得分:4)
在row
中使用column
和System.out.println
变量之前,需要初始化它们。 row
在外部循环中初始化,所以它很好,但是在内部循环中初始化了列,并且编译器不会假设它将会运行(即使它将在实践中)。
答案 2 :(得分:2)
Java编译器无法遵循您的代码。它看到column
在外部for
循环的主体内初始化,但无法确定该代码是否会运行。因此,在调用print
之前,无法确定您的变量是否始终被初始化。
另一方面,它知道外部for
循环的初始化语句无论如何都可以保证运行。因此,它可以保证row
将被初始化。