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?
The Unreachable statements refers to statements that won't get executed during the execution of the program are called Unreachable Statements. These statements might be unreachable because of the following reasons: Have a return statement before them. Have an infinite loop before them.
1(a) is compiled, line 12 raises an unreachable statement error because the break statement exits the for loop and the successive statement cannot be executed. To address this issue, the control flow needs to be restructured and the unreachable statement removed, or moved outside the enclosing block, as shown in Fig.
When we are keeping multiple catch blocks, the order of catch blocks must be from most specific to most general ones. i.e subclasses of Exception must come first and superclasses later. If we keep superclasses first and subclasses later, the compiler will throw an unreachable catch block error.
In computer programming, unreachable code is part of the source code of a program which can never be executed because there exists no control flow path to the code from the rest of the program.
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.
As explained in my answer to a similar question, the specific construct if(compile-time-false)
is exempt from the unreachability rules as an explicit backdoor. In this case, the compiler treats your break
as reachable because of that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With