2012-04-09 143 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

相關問題