Почему 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;
}
}
Ответы
Ответ 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
}