2012-04-09 147 views
3

我想了解更深层次的内容,如果我想知道什么时候Java需要初始化一个变量与简单的声明。在下面的代码中,变量'row'不需要分配一个值来编译和运行,然而变量'column'却可以。在Java中,为什么某些变量首先需要初始化,其他变量只需要声明?

注意:这个程序没有任何用处 - 它已被修剪,只显示这个问题的必要条件,不会浪费人们宝贵的时间。

下面的代码片段:

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 “可能尚未初始化。”?

+1

由于Crozin在下面提到,两个变量都需要初始化。你只是在第3行初始化行,但可能从来没有(根据编译器)初始化列,如果你不在第2行。 – 2012-04-09 02:26:03

回答

5

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

4

前两个rowcolumn变量在System.out.println使用时,它们需要被初始化,。 row在外部循环中被初始化,所以它很好,但是列在内部循环中被初始化,并且编译器不会假设这将永远运行(即使它在实践中)。

2

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

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

+0

这似乎是倒退了。编译器*可以*遵循你的代码,并且它可以看到在某些情况下'列'不会被初始化。 – erickson 2012-04-09 02:20:10

+0

在这个特定的例子中,'column'将​​始终被初始化。我想说的是,编译器不知道这一点。 – Taymon 2012-04-09 02:21:18

+0

我明白你的意思了。 – erickson 2012-04-09 03:15:28

相关问题