2012-05-17 106 views
3

在下面的代碼我期望它應該需要初始化變量ab在最後else塊,但是編譯器不喜歡它。流量分析 - 變量可能尚未初始化

import java.util.Random; 

public class Foo { 

    private void foo() { 

    double a,b; 
    boolean c; 

    double r = (new Random()).nextDouble(); 

    if(r < 0.25) { 
     a = 1; 
     b = 2; 
     c = true; 
    } else if(r >= 0.25 && r < 0.75) { 
     a = 3; 
     b = 3; 
     c = true; 
    } else { 
     // why is it necessary to init a and b here? 
     // given that c is set to false 
     c = false; 
    } 

    if(c) { 
     double k = a + b; 
    } 

    } 

} 

用上述代碼時,編譯器確實抱怨。

bash-3.2$ javac Foo.java 
Foo.java:25: variable a might not have been initialized 
     double k = a + b; 
       ^
Foo.java:25: variable b might not have been initialized 
     double k = a + b; 
        ^
2 errors 

我本來以爲編譯器可以做靜態分析,以弄清楚,如果c設置爲false k將不進行評估。所以我的問題是爲什麼編譯器要求我初始化ab

回答

7

編譯器不夠聰明,無法理解通過else塊將c設置爲false,並且因此將永遠不會執行下一個if塊。靜態分析比你期望的更有限,這也使得聯合更快,這也可能是一件好事,因爲更改else塊的代碼會突然使下一個if塊不可編譯,這將是煩人。