2014-03-27 98 views
0

我試圖用Java編寫的代碼:這個Java代碼爲什麼產生錯誤?

class D 
{ 
    public static void main(String arg[]) 
    { 
     f1(); 
    } 

    static void f1() 
    { 
     int a; 
     int b=5; 
     for(;b<=10;b++) 
      a=b; 
     System.out.println(a); 
    } 
} 

但它會產生一個錯誤,指出:變量a可能尚未初始化。爲什麼會發生這種情況,儘管在for循環中設置了a

+4

是的,你沒有初始化'a'。 – devnull

+0

'int a = 42;'也許? – devnull

+0

可能重複的[變量可能未被初始化錯誤](http://stackoverflow.com/questions/2448843/variable-might-not-have-been-initialized-error) – Drunix

回答

5

的循環可能無法運行(編譯器不知道肯定),因此a可能未初始化。

在此循環不執行打印語句,只是分配:

for(;b<=10;b++) 
    a=b; 
System.out.println(a); //this will only run after the loop. 

在上述情況下,如果b是>循環前10則a=b;永遠執行和打印聲明將得到初始化a

我假設你的意思是這個:

for(;b<=10;b++) { 
    a=b; 
    System.out.println(a); 
} 

如果您打算在循環後打印a,它初始化爲任何值是合適的,例如int a = 0;

+0

是的,這是我真正想明白的。我沒有故意初始化'a'和你告訴我的解決方案,它一直給我正確的輸出。但是我對循環的工作感到困惑,我仍然不明白爲什麼它會這樣。每次循環迭代時,它應該給'a'賦值'b'。這是不是發生?請詳細說明。 – Pinky

+0

@ user3467998是的,但是編譯器不知道循環是否會迭代,也就是說它不知道'b'是否符合條件(編譯器不那麼聰明,並且不會這樣做)幾乎沒有任何好處會增加很多複雜性)。 – Thomas

+0

謝謝非常清除我的困惑。我試圖用'if'條件來代替'for'循環,編譯器告訴我同樣的事情。但是當我添加了「其他」部分時,程序編譯得很好。如果(b <= 10)a = 5,那麼'f1()'的代碼爲'if'的System.out.println(一); – Pinky

2

方法體內部的變量不分配默認值,就像他們爲實例字段等

因此您int a聲明,不與值初始化a,生成你的編譯錯誤。

用默認值分配a以擺脫此。

...或聲明它的方法體外:

static int a; 

static void f1() { 
    ... 
    System.out.println(a); // no errors 
} 
2

靜態錯誤檢查不是那麼聰明。 它不知道你的循環會一直運行,因此你可以輸出'a'而不需要初始化它。

這種類型的問題只在運行時被提取,所以它會提醒你。

0

初始化變量

由於是局部變量和上堆疊和可變堆棧存儲器中創建不分配任何默認值創建局部變量。所以我們必須初始化局部變量。

相關問題