Why is x not initialized in the following ?
public class rough {
public static void main(String[] args) {
int x;
boolean found = false;
for (int i = 0; i < 10; i++) {
if (Math.random() < 0.5) {
found = true;
x = 10;
break;
}
}
if (!found)
x = -1;
System.out.println(x);//x isn't initialized here
}
}
On average, for half of the iterations, the if
inside the for loop would be true
, thus initializing x
. For the other half, found
stays false
therefore the outer if
would initialize. Therefore, I don't understand why the compiler is annoyed.
As the ultimate distillation (see successive simplifications below), consider
public static void main(String[] args) {
int x;
boolean found = false;
if (!found)
x = -1;
System.out.println(x);
}
which also gives the error that x
isn't init.
previous simplifications
Even more surprisingly, changing
if (Math.random() < 0.5)
to if(true)
also has the same problem.
In fact, investigating further, replacing the original for
loop by these
for (int i=0;i<1;i++)
x = 10;
for (; !found; ) {
x = 10;
break;
}
is equally worse. Only for(;;){... break;}
& for(;true;){... break;}
don't raise any init. errors.