Подтвердить что ты не робот

Компилятор жалуется на "отсутствующий оператор возврата", хотя невозможно достичь условия, в котором будет отсутствовать оператор возврата

В следующем методе компилятор жалуется на отсутствующий оператор return, хотя существует только один путь через метод и содержит оператор return. Для подавления ошибки требуется другой оператор return.

public int foo() {
    if (true) {
        return 5;
    }
}

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

4b9b3361

Ответ 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 использоваться как форма условной компиляции, как объяснил Дэйв Ньютон в своем ответе.