Подтвердить что ты не робот

Почему if/else if/else для простого логического значения, не приводящего к ошибке "недостижимый код"

Почему этот код не дает ошибку "недостижимый код"? Поскольку логическое значение может быть истинным или ложным.

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

    } else if (a == false) {

    } else {
        int c = 0;
        c = c + 1;
    }
}
4b9b3361

Ответ 1

От JLS 14.21. Недостижимые отчеты

Это ошибка времени компиляции, если оператор не может быть выполнен, потому что он недоступен.

и

Оператор else доступен, если утверждение if-then-else доступно.

Оператор if-then-else доступен. Таким образом, по определению компилятор считает, что else-statement доступен.

Примечание. Интересно, что следующий код также компилирует

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

Это неверно для while

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

потому что определение доступности для while отличается (внимание мое):

Скрытый оператор доступен, если оператор while доступен , а выражение условия не является константным выражением, значение которого ложно.

Ответ 2

Что касается компилятора, он дает только недостижимую ошибку кода, если есть возможность оставить область действия метода без КАЖДОГО выполнения части кода. В вашем случае да, блок else никогда не будет выполнен, но ожидая, что компилятор покажет ошибку, это похоже на то, что компилятор отлаживает ваш код для возможных логических ошибок. В качестве примера возьмем следующий код.

public static boolean method()
{
    boolean flag = false;
    if(flag == true)
    {
        return true;
    }
    else if(flag == false)
    {
        return false;
    }
    else
    {
        return true & false; //comment in this line to get error
    }


    //return true | false; comment out this line to get error
}