web-dev-qa-db-ja.com

単純なブールのif / else if / elseが「到達できないコード」エラーを出さないのはなぜですか

このコードが「到達不能コード」エラーを出さないのはなぜですか?ブール値はtrueまたはfalseにしかなりません。

public static void main(String args[]) {
    boolean a = false;
    if (a == true) {

    } else if (a == false) {

    } else {
        int c = 0;
        c = c + 1;
    }
}
58
Will

From JLS 14.21。Unreachable Statements

到達できないためにステートメントを実行できない場合は、コンパイル時エラーです。

そして

Else-statementは、if-then-elseステートメントに到達できる場合にのみ到達可能です。

If-then-elseステートメントに到達できます。そのため、コンパイラーはその定義から、elseステートメントが到達可能であると見なします。

注:興味深いことに、次のコードもコンパイルされます

// This is ok
if (false) { /* do something */ }

これはwhileには当てはまりません

// This will not compile
while (false) { /* do something */ }

whileの到達可能性の定義が異なるため(強調は私):

含まれているステートメントは、whileステートメントが到達可能であり、条件式が値がfalseの定数式ではない場合に到達可能です。

59
dejvuth