Кто-нибудь знает, почему:
public void foo()
{
System.out.println("Hello");
return;
System.out.println("World!");
}
Сообщается как "недостижимая ошибка" в Eclipse, но
public void foo()
{
System.out.println("Hello");
if(true) return;
System.out.println("World!");
}
Только запускает предупреждение "Мертвый код"?
Единственное объяснение, о котором я могу думать, это то, что компилятор Java только флага первый, и что некоторый дополнительный анализ в Eclipse показывает второй. Однако, если это так, почему компилятор Java не может определить этот случай во время компиляции?
Разве компилятор Java не выяснил во время компиляции, что if (true) не имеет эффекта, что дает байт-код, который по существу идентичен? В какой момент применяется аналитический код достижимого кода?
Я думаю, что более общий способ подумать об этом вопросе: "когда применяется аналитик достижимого кода"? При преобразовании второго фрагмента кода Java в конечный байт-код я уверен, что в какой-то момент удаляется эквивалент "if (true)", а представления двух программ становятся идентичными. Разве компилятор Java не повторил бы анализ своего достижимого кода?