2013-02-12 107 views
2

我沒有發現這個代碼有任何錯誤,但是eclipse告訴我變量沒有被初始化。這只是一個警告,但編譯後也不起作用。我根本找不到這個代碼100%正確的錯誤和事情。請注意,可以因爲下面提供的代碼被簡化不會輕易改變這個代碼的結構,所以你不要有太多的閱讀;-)Java:局部變量被初始化,仍然出錯

int min1; float somefloat; 
try { 
    //setting values for min and somefloat 
    min1 = 1; 
    somefloat = 0.92f; 
} catch (IOException ioe) { 
    System.err.println("Read Exception"); 
} 
while (true){ 
    //warning: variables min1 and somefloat may not be initialized. 
    float value1 = (1023 - min1) * somefloat; 
    System.out.println("Value: " + value1); 
} 

回答

1

編譯器不分析,如果在具體案例中的變量將被初始化或沒有。它確保如果變量只在初始化嘗試,而不是在終於將保證他們可能將未初始化。

給出與「明顯」條件類似的嘗試,如if(1>0) {}。編譯器編譯而不是分析你的代碼。雖然對於人來說,顯然會發生某些事情,但是java編譯器沒有代碼來檢測這種情況,它們都不是由java語法指定的。所以你希望編譯器不需要AI,以保持編譯的清晰,可預測和快速。

你的代碼有,順便說一句,錯誤將被報告,而不是你描述的這個,因爲沒有地方IOException可以被拋出。

+0

IOException可以拋出原代碼 – 2013-02-12 12:05:16

+1

但是讀者只能看到你發佈的內容。 – 2013-02-12 12:06:29

0

你必須初始化它們同時至少聲明它們或在try-catch區塊之外。因爲編譯器不能確定try-catch塊內的初始化是否會正常完成,在這種情況下,你將會在外面有一個未初始化的變量。

int min1=0; float somefloat=0.0f; 
+1

這就是問題所在。在發生任何異常之前,它們都在try塊內初始化。 – jlordo 2013-02-12 11:55:22

+0

但在try-catch塊中通常可能有錯誤。如果出現錯誤,初始化可能會被跳過 - 然後它們不會被初始化。 – MalaKa 2013-02-12 11:56:52

+0

@jlordo好吧,在你使用它們之前,局部變量需要被初始化。 – PermGenError 2013-02-12 11:56:55

2

你必須初始化所有的變量,他們進入任何try塊之前。 Java編譯器不知道在你的情況下,沒有辦法導致異常。

因此從理論上講,可能是是一個例外某處這會使您的變量未初始化。這是不可接受的。因此警告。

只需將您的變量初始化爲零。

int min1 = 0; 
float somefloat = 0f; 
0

然而日食告訴我,該變量未初始化

顯示警告的原因這是一個可能性,即例外的是變量中try初始化之前拋出。那麼在while內變量保持未初始化。

0

它們應該有一個初始值,以防進入catch區塊。試試這個:

int min1 = 0; float somefloat = 0f; 
try { 
    //setting values for min and somefloat 
    min1 = 1; 
    somefloat = 0.92f; 
} catch (IOException ioe) { 
    System.err.println("Read Exception"); 
} 
while (true){ 
    //warning: variables min1 and somefloat may not be initialized. 
    float value1 = (1023 - min1) * somefloat; 
    System.out.println("Value: " + value1); 

}

-1
private void tset(){ 
    int min1; float somefloat; 
    try { 
     //setting values for min and somefloat 
     min1 = 1; 
     somefloat = 0.92f; 
    while (true){ 
     //warning: variables min1 and somefloat may not be initialized. 
     float value1 = (1023 - min1) * somefloat; 
     System.out.println("Value: " + value1); 
    } 
    } catch (Exception ioe) { 
     System.err.println("Read Exception"); 
    } 
} 

這可能是您正在尋找的代碼...

+2

使用互聯網速記(「b」,「u」,「r」)在這裏皺起了眉頭。請嘗試用真實的文字寫出完整的句子。它使閱讀和理解變得更容易。 – pap 2013-02-12 12:20:13

0

你需要在聲明期間初始化變量。在try中的變量賦值會覆蓋該值,如果發生任何異常(不知道你的情況如何..)它將採用默認值。在編譯期間,編譯器不會查看你的代碼是否會拋出異常(除了throw,它需要匹配catch),所以它需要一個明確的初始化。