In the following code I’d expect that it should not be necessary to initialise variables a and b in last else block, however the compiler does not like it.
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;
}
}
}
With the code above, the compiler does complain.
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
I would have thought that the compiler could do the static analysis to figure out that k will not be evaluated if c is set to false. So my question is why does the compiler demand that I initialise a and b?
The compiler isn’t smart enough to understand that going through the
elseblock will setctofalse, and that the nextifblock thus won’t ever be executed. The static analysis is more limited than what you expect, which also makes the comilation faster/And it’s probably a good thing, because changing the code of the
elseblock would suddenly make the nextifblock not compilable, which would be annoying.