Как мне понять такое поведение компилятора Java?
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
Спасибо.
ИЗМЕНИТЬ:
Я узнаю суть через несколько минут:
В первом случае компилятор выдает ошибку из-за бесконечного цикла. В обоих случаях компилятор не думает о коде внутри консеквента.
РЕДАКТИРОВАНИЕ II:
Что меня впечатляет в javac сейчас:
if (true) return; // Correct
}
while (true) return; // Correct
}
Похоже, что javac знает, что находится внутри как цикла, так и последовательностей, но когда вы пишете другую команду (как в первом примере), вы получаете неэквивалентное поведение (которое выглядит так, как будто javac забыл, что находится внутри цикла/если).
public static final EDIT III: В результате этого ответа я могу заметить (надеюсь, правильно): выражения как if (arg) { ...; return;}
и while (arg) { ...; return;}
эквивалентны как семантически, так и синтаксически (в байт-коде) для Java, если argv
непостоянна (или фактически окончательный тип) выражение. Если argv
является постоянным выражением, байт-код (и поведение) может отличаться.
Отказ от ответственности Этот вопрос касается не недостижимых операторов, а другой обработки логически эквивалентных выражений, таких как while true return
и if true return
.