Компилятор жалуется на "отсутствующий оператор возврата", хотя невозможно достичь условия, в котором будет отсутствовать оператор возврата
В следующем методе компилятор жалуется на отсутствующий оператор return, хотя существует только один путь через метод и содержит оператор return
. Для подавления ошибки требуется другой оператор return
.
public int foo() {
if (true) {
return 5;
}
}
Учитывая, что компилятор Java может распознавать бесконечные циклы, почему он не справляется с этой ситуацией? Связанный вопрос подсказывает, но не содержит подробностей для этого конкретного случая.
Ответы
Ответ 1
JLS 14.21, Unreachable Statementments - это раздел, который имеет дело с этим:
Оператор if, независимо от того, имеет ли он часть else, обрабатывается необычным образом. По этой причине это обсуждается отдельно в конце этого раздела.
В конечном счете это связано с тем, как обрабатывается условная компиляция. Рассмотрим этот метод:
public int foo() {
if (DEBUG) {
return 5;
}
}
Если DEBUG
- static final boolean true;
, вы можете подумать, что компилятор должен быть достаточно умным, чтобы понять, что метод всегда будет возвращать 5
. Но если он изменился на false
, код больше недействителен.
Метод должен быть действителен для всех путей через метод без изменения исходного кода, что позволяет оптимизировать компиляторы для исключения байт-кода без изменений источника независимо от значения флага.
очень конец связанного раздела JLS подробно освещен.
Ответ 2
Причина, по которой компилятор жалуется, связана с этой ключевой точкой из Раздел 14.21 Спецификации Java Language, обсуждая недостижимые утверждения:
За исключением специальной обработки операторов while
, do
и for
, выражение условия которых имеет постоянное значение true
, значения потоков не учитываются при анализе потока.
Обратите внимание, что if
не является одним из операторов, которые имеют специальную обработку константных условий true
. Причина, по которой она исключена из этой специальной обработки, заключается в том, чтобы позволить if
использоваться как форма условной компиляции, как объяснил Дэйв Ньютон в своем ответе.