В следующем коде я бы ожидать, что он должен не необходимо инициализировать переменные 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
?