Хотя (false) вызывает ошибку компиляции недопустимых операторов
Недавно я удалил блок кода из нашей базы кода до выпуска и использовал оператор if (false), чтобы предотвратить выполнение:
if (false) {
ArrayList<String> list = new ArrayList<String>();
...
}
Это компилируется и предотвратит выполнение блокирующего кода кода (правильно или неправильно, а не текущий аргумент).
Однако, случайно, я изменил блок выше:
while (false) {
ArrayList<String> list = new ArrayList<String>();
...
}
и получил ошибку компиляции недостижимого оператора.
Я ценю ошибку компиляции и понимаю причины, однако, я изо всех сил пытаюсь понять разницу между этими двумя блоками и почему первый компилирует отлично, но последний не делает, когда у них обоих есть недостижимые утверждения.
Ответы
Ответ 1
В обоих случаях компилятор должен вызывать ошибку, потому что код между скобками по существу бессмыслен, , но if (false)
хранится в Java для имитации препроцессора C/С++ #if 0
, довольно распространенного способ отключения частей кода для тестирования или отладки.
EDIT: для справки, "условная компиляция" подробно описана в конце главы 14.21 Спецификации языка Java.
Ответ 2
"Java использует простой алгоритм анализа потока, чтобы найти наиболее распространенные случаи недостижимого кода, и все такие недостижимые кодовые блоки будут помечены как ошибки времени компиляции. Поэтому ваш оператор while (false) {...}" выдает ошибку.
Однако Java делает специальное исключение для "if (false) {...}", потому что программисты часто используют эту конструкцию во время разработки, чтобы временно отключить часть программы. Вот почему компилятор принимает это утверждение.
Если вас интересуют подробные подробности, обратитесь к описанию спецификаций языка Java недопустимых операторов @http://docs.oracle.com/javase/specs/#14.21."
Цитата из http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false