Flow analysis in javac - variable a might not have been initialized

java, javac

Solution

The compiler isn't smart enough to understand that going through the `else` block will set `c` to `false`, and that the next `if` block 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 `else` block would suddenly make the next `if` block not compilable, which would be annoying.

Problem

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`?

Original source