Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 508
dryairship Avatar asked Dec 24 '15 13:12

dryairship


People also ask

What does it mean when a statement is unreachable in Java?

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.

How do I fix unreachable statement error in Java?

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.

Why does Java generate unreachable code errors during multiple catch statements?

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.

Why is unreachable code an 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.


2 Answers

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.

like image 126
assylias Avatar answered Oct 12 '22 02:10

assylias


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.

like image 11
chrylis -cautiouslyoptimistic- Avatar answered Oct 12 '22 01:10

chrylis -cautiouslyoptimistic-