Очевидное ложное условие в else if, не дающее мертвого кода для тела внутри

Просматривая старый код, написанный одним из моих товарищей по команде, я нашел этот действительно странный код:

if (...) {
    // some code

} else if (this == null) {
    System.out.println("I expected this to be dead code!");
}

Странно, не правда ли? НАСКОЛЬКО МНЕ ИЗВЕСТНО, this == null состояние никогда не может быть true, что должно быть очевидно для компилятора, так как он знает значение this а также null и то и другое. Но, к моему удивлению, это не было помечено как мертвый код.

Я пробовал этот код как в Eclipse, так и через командную строку. Я запустил следующую команду, чтобы включить все предупреждения:

javac -Xlint:all MyClass.java

Тем не менее, он не дал никакого предупреждения.

Наоборот, если я изменю else if блок для:

else if (false) {
    System.out.println("As expected, this is dead code");
}

Заявление внутри было помечено как мертвый код, как я и ожидал.

Так почему это поведение? Это только заставляет меня думать, что может быть какое-то условие, когда this на самом деле может быть null, Это?

3 ответа

Решение

JLS имеет определение недоступного кода:

Анализ учитывает структуру высказываний. За исключением специальной обработки while, do и операторов, выражение условия которых имеет постоянное значение true, значения выражений не учитываются в анализе потока.

Так что это не считается "недоступным".

Также посмотрите это обсуждение о недостижимых ошибках кода и предупреждениях о мертвых кодах.

Теорема Райса подразумевает, что проверка того, вычисляет ли выражение Java false неразрешима. то есть теоретически невозможно определить, мертв ли ​​какой-либо произвольный код.

Поскольку компилятор java не может обнаружить весь мертвый код, разработчики остановились на очень специфическом наборе экземпляров мертвого кода, который они могли бы обнаружить.

Компилятор, кажется, не совсем точен в обнаружении неявно-всегда ложных условий, и даже если это подразумевается или указано в JLS/, очевидно, ложно, он может не уловить этот факт. Проверка is-null не так проста, чтобы ее поймать, если просто перечислить набор "очевидных условий" для проверки, поэтому она может быть упущена.

Другие вопросы по тегам