In the following method, the compiler complains about a missing return statement even though there is only a single path through the method, and it contains a
JLS 14.21, Unreachable Statements is the section that deals with this:
The if statement, whether or not it has an else part, is handled in an unusual manner. For this reason, it is discussed separately at the end of this section.
Ultimately it has to do with how conditional compilation is handled. Consider this method:
public int foo() {
if (DEBUG) {
return 5;
}
}
If DEBUG
is static final boolean true;
you might think the compiler should be smart enough to realize the method will always return 5
. But if it's changed to false
, the code is no longer valid.
The method must be valid for all paths through the method without a source code change, allowing optimizing compilers to omit bytecode without source modifications regardless of the flag's value.
The very end of the linked JLS section goes in to significant detail.
The reason why the compiler is complaining has to do with this key point from Section 14.21 of the Java Language Specification, discussing unreachable statements:
Except for the special treatment of
while
,do
, andfor
statements whose condition expression has the constant valuetrue
, the values of expressions are not taken into account in the flow analysis.
Note that if
is not one of the statements that has special handling of true
constant conditions. The reason it is excluded from this special handling is to allow if
to be used as a form of conditional compilation, as Dave Newton explained in his answer.