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
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, andforstatements 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.