2012-05-17 3 views
3

В следующем коде я бы ожидать, что он должен не необходимо инициализировать переменные a и b в последнем еще блоке, однако компилятор не нравится.анализ потока в JAVAC - переменная а не может быть инициализирован

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 

Я бы подумал, что компилятор может сделать статический анализ, чтобы выяснить, что k не будет оцениваться, если c установлен в ложь. Поэтому мой вопрос в том, почему компилятор требует, чтобы я инициализировал a и b?

ответ

7

Компилятор не достаточно умен, чтобы понять, что происходит через else блок будет установлен c к false, и что следующий if блок, таким образом, не будет когда-либо будет выполнен. Статический анализ более ограничен, чем ожидаемый, что также ускоряет компиляцию/

И это, вероятно, хорошо, потому что изменение кода блока else вдруг сделает следующий блок if, который не подлежит компиляции, раздражает.

Смежные вопросы