2016-03-18 2 views
57

Почему этот код не дает ошибку «недоступный код»? Поскольку логическое значение может быть истинным или ложным.Почему 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

Смотрите вторую половину этого вопроса: http://stackoverflow.com/questions/9276378/unreachable-code-compiler-error – azurefrog

+1

Также интересно: http://stackoverflow.com/questions/20299914/iffalse -vs-whilefalse-unreachable-code-vs-dead-code – Tom

+9

Проверка в JLS дает ответ (как всегда): * «Оператор else доступен, если оператор if-then-else доступен." *. Поскольку оба 'if' и' else if' достижимы, это также '' инструкция 'else'. – Tom

ответ

58

От JLS 14.21. Unreachable Statements

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

и

еще-оператор достижима тогда и только тогда, если-то-иначе оператор достижим.

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

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

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

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

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

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

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

+4

Я не знаю, понимали ли это дизайнеры Java, но может быть полезно иметь 'if (COMPILE TIME CONSTANT EXPRESSION) {. ..} ', где CONPLANT EXPRESSION COMPILE TIME может быть истинным или ложным в зависимости от среды. – zwol

-7

Что касается компилятора, то он дает только недостижимую ошибку кода, если есть возможность оставить область действия метода без КАЖДОГО выполнения части кода. В вашем случае да, блок 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 
} 
+1

Поскольку переменный флаг локален, инициализирован и никогда не модифицирован, компилятор может легко распространять его значение (и, вероятно, он будет), заменяя (внутренне) все использование «флага» с «ложным». поэтому утверждения становятся «if (false == true)», которые компилятор может тривиально оценивать во время компиляции, а не времени выполнения – simpleuser

 Смежные вопросы

  • Нет связанных вопросов^_^