Почему 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;
}
}
2 ответа
Из JLS 14.21. Недоступные заявления
Это ошибка времени компиляции, если оператор не может быть выполнен, потому что он недоступен.
а также
Оператор else доступен, если оператор 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.
Что касается компилятора, он дает ошибку недостижимого кода, только если есть возможность выйти из области действия метода, НИКОГДА не выполняя часть кода. В вашем случае да 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
}