There are many kinds of statements in the Java language. Most correspond to statements in the C and C++ languages, but some are unique to Java.
As in C and C++, the Java if statement suffers from the so-called "dangling else problem," illustrated by this misleadingly formatted example:
if (door.isOpen())
if (resident.isVisible())
resident.greet("Hello!");
else door.bell.ring(); // A "dangling else"
The problem is that both the outer if statement and the inner if statement might
conceivably own the else clause. In this example, one might surmise that the programmer intended the else clause to belong to the outer if statement. The Java
language, like C and C++ and many languages before them, arbitrarily decree that
an else clause belongs to the innermost if to which it might possibly belong.
This rule is captured by the following grammar:
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement StatementNoShortIf:
StatementWithoutTrailingSubstatement
LabeledStatementNoShortIf
IfThenElseStatementNoShortIf
WhileStatementNoShortIf
ForStatementNoShortIf StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
The following are repeated from §14.8 to make the presentation here clearer:
IfThenStatement:
if (Expression)Statement IfThenElseStatement:
if (Expression)StatementNoShortIfelseStatement IfThenElseStatementNoShortIf:
if (Expression)StatementNoShortIfelseStatementNoShortIf
Statements are thus grammatically divided into two categories: those that might end in an if statement that has no else clause (a "short if statement") and those that definitely do not. Only statements that definitely do not end in a short if statement may appear as an immediate substatement before the keyword else in an if statement that does have an else clause. This simple rule prevents the "dangling else" problem. The execution behavior of a statement with the "no short if" restriction is identical to the execution behavior of the same kind of statement without the "no short if" restriction; the distinction is drawn purely to resolve the syntactic difficulty.