Я попробовал следующее в Eclipse:
-
if (false) {}
: предупреждение "мертвый код"
-
while (false) {}
: ошибка компиляции 'недостижимый код'
Мне было интересно, есть ли настоящая "причина" для этой разницы. Я уже нашел это...
Ошибка компилятора кода недоступна
... но почему бы не разрешить while (false)
для той же цели отладки?
Ответ 1
раздел JLS по недостижимому коду объясняет обоснование. По сути, Java обычно не должен использовать условную компиляцию, например, C обычно работает с #ifdef
, но есть некоторые ситуации (такие как отладка и, в частности, обратная двоичная совместимость), где требуется компилятор для полного выделения кода, и поэтому для этой цели разрешена конкретная конструкция if(false)
.
Ответ 2
Вы должны прочитать Unreachable Statementments. Хотя с while(false)
компилятор выдает ошибку, но с if(false)
он будет показывать предупреждение пользователю.
Хотя if (false)
хранился в Java для имитации препроцессора C/С++ #if 0
В спецификации указано, что:
if (false) {x = 3; }
не приводит к ошибке времени компиляции. Оптимизирующий компилятор может что утверждение x = 3; никогда не будут выполнены и могут выбрать опустить код для этого оператора из сгенерированного файла класса, но утверждение x = 3; не рассматривается как "недостижимый" в технических смысл, указанный здесь.
Обоснование этого различного обращения заключается в том, чтобы позволить программистам определить "переменные флага" , например:
static final boolean DEBUG = false; и затем напишите код, например:
if (DEBUG) {x = 3; } Идея состоит в том, что следует изменить значение DEBUG от false до true или от true до false, а затем скомпилируйте код правильно, без каких-либо изменений в тексте программы.