Search code examples
javaif-statementunreachable-codeunreachable-statement

Why does a Java Compiler not produce an unreachable statement error for an unreachable then statement?


If I try to compile

for(;;)
{

}
System.out.println("End");

The Java compiler produces an error saying Unreachable statement. But if I add another "unreachable"(according to me) break statement and make it:

for(;;)
{
    if(false) break;
}
System.out.println("End");

It compiles. Why does it not produce an error?


Solution

  • The behaviour is defined in the JLS description of unreachable statements:

    The then-statement is reachable iff the if-then statement is reachable.

    So the compiler determines that the then-statement (break;) is reachable, regardless of the condition in the if.

    And a bit further, emphasis mine:

    A basic for statement can complete normally iff at least one of the following is true:

    • The for statement is reachable, there is a condition expression, and the condition expression is not a constant expression (§15.28) with value true.
    • There is a reachable break statement that exits the for statement.

    So the for can complete normally because the then-statement contains a break. As you noticed, it would not work if you replaced break with return.


    The rationale is explained towards the end of the section. In substance, if has a special treatment to allow constructs such as:

    if(DEBUG) { ... }
    

    where DEBUG may be a compile time constant.