Почему недоступный код не обнаруживается, когда условие if является константой? - PullRequest
6 голосов
/ 12 января 2020

Я готовлюсь к экзамену Java и столкнулся с ошибкой компилятора "недостижимое утверждение", например:

Source.java:10: error: unreachable statement
       System.out.println("This code is not reachable");

Я пытаюсь понять, когда это произойдет или не произойдет - например, не происходит в следующих случаях:

// Case #1
if (true) {
    System.out.println("This code is reachable");
} else {
    System.out.println("This code is not reachable"); // Compiles OK
}

// Case #2
for (i = 0; i < 5; i++) {
    if (true) continue;
    System.out.println("This code is not reachable"); // Compiles OK
}

Кажется, компилятор недостаточно умен, чтобы определять, когда условие if постоянно true - может кто-то предоставить более подробное объяснение?

1 Ответ

6 голосов
/ 12 января 2020

Из спецификации языка Java, 14.21. Недоступные утверждения (выделено мной):

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

Этот раздел посвящен точное объяснение слова «достижимый». Идея состоит в том, что должен существовать некоторый возможный путь выполнения от начала конструктора, метода, инициализатора экземпляра или инициализатора stati c, который содержит инструкцию к самой инструкции. Анализ учитывает структуру высказываний. За исключением специальной обработки операторов while, do и for, выражение условия которых имеет постоянное значение true, значения выражений не учитываются при анализе потока .

Таким образом, хотя код действительно недоступен, компилятор явно не считает его таковым. Указанная причина заключается в том, что программистам разрешено определять «флажковые» переменные, такие как

static final boolean DEBUG = false;

if (DEBUG) { x=3; }

. Должна быть возможность переключения DEBUG между false и true без необходимости что-либо менять в коде. (из-за ошибок компиляции).

...