14.21. Unreachable Statements
It is a compile-time error if a statement cannot be executed because
it is unreachable.
This section is devoted to a precise explanation of the word
"reachable." The idea is that there must be some possible execution
path from the beginning of the constructor, method, instance
initializer, or static initializer that contains the statement to the
statement itself. The analysis takes into account the structure of
statements. Except for the special treatment of while, do, and for
statements whose condition expression has the constant value true, the
values of expressions are not taken into account in the flow analysis.
For example, a Java compiler will accept the code:
{
int n = 5;
while (n > 7) k = 2; } even though the value of n is known at compile time and in principle it can be known at compile time that the
assignment to k can never be executed.
The rules in this section define two technical terms:
whether a statement is reachable
whether a statement can complete normally
The definitions here allow a statement to complete normally only if it
is reachable.
To shorten the description of the rules, the customary abbreviation
"iff" is used to mean "if and only if."
A reachable break statement exits a statement if, within the break
target, either there are no try statements whose try blocks contain
the break statement, or there are try statements whose try blocks
contain the break statement and all finally clauses of those try
statements can complete normally.
This definition is based on the logic around "attempts to transfer
control" in §14.15.
A continue statement continues a do statement if, within the do
statement, either there are no try statements whose try blocks contain
the continue statement, or there are try statements whose try blocks
contain the continue statement and all finally clauses of those try
statements can complete normally.
The rules are as follows:
The block that is the body of a constructor, method, instance
initializer, or static initializer is reachable.
An empty block that is not a switch block can complete normally iff it
is reachable.
A non-empty block that is not a switch block can complete normally iff
the last statement in it can complete normally.
The first statement in a non-empty block that is not a switch block is
reachable iff the block is reachable.
Every other statement S in a non-empty block that is not a switch
block is reachable iff the statement preceding S can complete
normally.
A local class declaration statement can complete normally iff it is
reachable.
A local variable declaration statement can complete normally iff it is
reachable.
An empty statement can complete normally iff it is reachable.
A labeled statement can complete normally if at least one of the
following is true:
The contained statement can complete normally.
There is a reachable break statement that exits the labeled statement.
The contained statement is reachable iff the labeled statement is
reachable.
An expression statement can complete normally iff it is reachable.
An if-then statement can complete normally iff it is reachable.
The then-statement is reachable iff the if-then statement is
reachable.
An if-then-else statement can complete normally iff the then-statement
can complete normally or the else-statement can complete normally.
The then-statement is reachable iff the if-then-else statement is
reachable.
The else-statement is reachable iff the if-then-else statement is
reachable.
This handling of an if statement, whether or not it has an else part,
is rather unusual. The rationale is given at the end of this section.
An assert statement can complete normally iff it is reachable.
A switch statement can complete normally iff at least one of the
following is true:
The switch block is empty or contains only switch labels.
The last statement in the switch block can complete normally.
There is at least one switch label after the last switch block
statement group.
The switch block does not contain a default label.
There is a reachable break statement that exits the switch statement.
A switch block is reachable iff its switch statement is reachable.
A statement in a switch block is reachable iff its switch statement is
reachable and at least one of the following is true:
It bears a case or default label.
There is a statement preceding it in the switch block and that
preceding statement can complete normally.
A while statement can complete normally iff at least one of the
following is true:
The while statement is reachable and the condition expression is not a
constant expression (§15.28) with value true.
There is a reachable break statement that exits the while statement.
The contained statement is reachable iff the while statement is
reachable and the condition expression is not a constant expression
whose value is false.
A do statement can complete normally iff at least one of the following
is true:
The contained statement can complete normally and the condition
expression is not a constant expression (§15.28) with value true.
The do statement contains a reachable continue statement with no
label, and the do statement is the innermost while, do, or for
statement that contains that continue statement, and the continue
statement continues that do statement, and the condition expression is
not a constant expression with value true.
The do statement contains a reachable continue statement with a label
L, and the do statement has label L, and the continue statement
continues that do statement, and the condition expression is not a
constant expression with value true.
There is a reachable break statement that exits the do statement.
The contained statement is reachable iff the do statement is
reachable.
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.
The contained statement is reachable iff the for statement is
reachable and the condition expression is not a constant expression
whose value is false.
An enhanced for statement can complete normally iff it is reachable.
A break, continue, return, or throw statement cannot complete
normally.
A synchronized statement can complete normally iff the contained
statement can complete normally.
The contained statement is reachable iff the synchronized statement is
reachable.
A try statement can complete normally iff both of the following are
true:
The try block can complete normally or any catch block can complete
normally.
If the try statement has a finally block, then the finally block can
complete normally.
The try block is reachable iff the try statement is reachable.
A catch block C is reachable iff both of the following are true:
Either the type of C's parameter is an unchecked exception type or
Throwable; or some expression or throw statement in the try block is
reachable and can throw a checked exception whose type is assignable
to the parameter of the catch clause C.
An expression is reachable iff the innermost statement containing it
is reachable.
See §15.6 for normal and abrupt completion of expressions.
There is no earlier catch block A in the try statement such that the
type of C's parameter is the same as or a subclass of the type of A's
parameter.
The Block of a catch block is reachable iff the catch block is
reachable.
If a finally block is present, it is reachable iff the try statement
is reachable.