Недоступный код - ошибка согласно Спецификации языка Java .
Цитировать из JLS:
Идея состоит в том, что должен существовать некоторый возможный путь выполнения от начала конструктора, метода, инициализатора экземпляра или статического инициализатора, который содержит инструкцию, до самой инструкции. Анализ учитывает структуру высказываний. За исключением специальной обработки while, do и операторов, выражение условия которых имеет постоянное значение true, значения выражений не учитываются в анализе потока.
Это означает, что блок if
не учитывается, так как, если вы пройдете по одному из путей оператора if
, вы можете достичь конечного оператора печати. Если вы изменили свой код на:
public void foo() {
System.out.println("Hello");
if (true)
return;
else
return;
System.out.println("World!");
}
тогда внезапно он больше не будет компилироваться, поскольку в операторе if
нет пути, который позволил бы достичь последней строки.
То есть Java-совместимому компилятору не разрешено компилировать ваш первый фрагмент кода. Чтобы далее процитировать JLS:
Например, следующий оператор приводит к ошибке времени компиляции:
while (false) { x=3; }
потому что утверждение х = 3; не достижимо; но внешне похожий случай:
if (false) { x=3; }
не приводит к ошибке во время компиляции. Оптимизирующий компилятор может понять, что выражение x = 3; никогда не будет выполнен и может пропустить код для этого оператора из сгенерированного файла класса, но оператор x = 3; не считается «недоступным» в техническом смысле, указанном здесь.
Второе предупреждение, которое Eclipse сообщает о мертвом коде, - это предупреждение, генерируемое компилятором, которое, согласно JLS, не является "недостижимым", но на практике это так. Это дополнительная проверка стиля lint , которую предоставляет Eclipse. Это совершенно необязательно, и с помощью конфигурации Eclipse может быть отключено или превращено в ошибку компилятора вместо предупреждения.
Этот второй блок является "запахом кода", обычно блоки if (false)
вставляются, чтобы отключить код для целей отладки, а его оставление обычно является случайным, и, следовательно, предупреждение.
На самом деле, Eclipse проводит еще более сложные тесты, чтобы определить возможные значения оператора if, чтобы определить, можно ли выбрать оба пути. Например, Eclipse также будет жаловаться на мертвый код в следующем методе:
public void foo() {
System.out.println("Hello");
boolean bool = Random.nextBoolean();
if (bool)
return;
if (bool || Random.nextBoolean())
System.out.println("World!");
}
Он сгенерирует недоступный код для второго оператора if, поскольку это может привести к тому, что bool
должно быть только false
в этой точке кода. В таком коротком фрагменте кода очевидно, что два оператора if проверяют одно и то же, однако, если в середине есть 10-15 строк кода, это может быть уже не так очевидно.
Итак, в общем, разница между ними: одна запрещена JLS, а другая нет, но обнаруживается Eclipse как услуга для программиста.