Подтвердить что ты не робот

If (false) vs. while (false): недостижимый код и мертвый код

Я попробовал следующее в Eclipse:

  • if (false) {}: предупреждение "мертвый код"
  • while (false) {}: ошибка компиляции 'недостижимый код'

Мне было интересно, есть ли настоящая "причина" для этой разницы. Я уже нашел это...

Ошибка компилятора кода недоступна

... но почему бы не разрешить while (false) для той же цели отладки?

4b9b3361

Ответ 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, а затем скомпилируйте код правильно, без каких-либо изменений в тексте программы.