class For1
{
public static void main(String args[])
{
int a = 0;
for(;;)
{
break;
System.out.println(a); //Line 1
++a;//Line 2
}
}
}
I know that Line 1/Line 2 will never be executed. But still I don't understand why a compile time error is thrown. I am getting "unreachable statement" compile error.
Does it mean that compiler checks whether it is able to compile for all branches/lines of code ?
It means the compiler checks that every statement is reachable.
From section 14.21 of the JLS:
The section then documents how reachability is defined.
In particular, the relevant points in your case are:
So your "line 1" statement is preceded by a statement (
break;
) which cannot complete normally, and therefore it's unreachable.The compiler is also able to make that conclusion, and assumes you are making a mistake. And yes, the Java compiler does a pretty good amount of "Data-Flow Analysis". The most common related message is the one about variables not initialized. The second most frequent is, I believe, precisely this one, about code not reachable.
Yes compiler compiles the whole body of code and make byte code according to your code, it smarter enough to detects
unreachable code
alsodead code
. Immediatebreak
in thefor-loop
makes unreachable other statements.Unreachable code is meaningless and redundant. If you have some unreachable code in your program it is a mistake and needs to be fixed. Hence compiler throws an error.
You can refer to similar questions below
Unreachable code: error or warning? and Why does Java have an "unreachable statement" compiler error?
The compiler will check if there is more code after certain keywords. Another keyword which will cause a similar message is if you replace
break
byreturn
.The compiler is able to determine that these two statement will never, ever be executed, and helps you write correct code by refusing to compile it, because this has 99.9% chance of being an error rather than a conscious choice to add statements that will never be executed.