2012-01-14 3 views
29

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

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

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

+2

в 'foo4()' компилятор не настолько умен, что он понимает, что функция всегда возвращает 5. Он просто проверяет, что не все пути кода возвращают что-то. –

+1

Если оператор обрабатывается специально в анализе потока, см. JLS 14.21: * Оператор if ... обрабатывается необычным образом. По этой причине это обсуждается отдельно в конце этого раздела * – irreputable

+0

@irreputable В будущем, если вы хотите оспаривать закрытие вопроса, подумайте о том, чтобы помечать сообщение для просмотра модератора или публикации на [meta]. Это намного более конструктивно, чем бегать вокруг оскорбительных людей или вандализма. –

ответ

12

JLS 14.21, Unreachable Statements является раздел, который имеет дело с этим:

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

В конечном счете это связано с обработкой условной компиляции. Рассмотрим этот метод:

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

Если DEBUG является static final boolean true; вы можете подумать, что компилятор должен быть достаточно умен, чтобы понять метод всегда будет возвращать 5. Но если он изменен на false, код не действует.

Метод должен быть действительным для всех путей через метод без изменения исходного кода, что позволяет оптимизировать компиляторы для исключения байт-кода без изменений источника, независимо от значения флага.

very end of the linked JLS section подробно останавливается.

+0

+1 JLS ссылка. – paislee

+0

@DaveNewton: обновите второй url (очень конец связанного раздела JLS) –

+0

@Nandkumar Обновите его до чего? –

5

Причина, почему компилятор жалуется должен делать с этой ключевой точкой из Section 14.21 of the Java Language Specification, обсуждая недостижимые заявления:

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

Обратите внимание, что if является не один из операторов, который имеет специальную обработку true постоянных условий. Причина, по которой исключена эта специальная обработка, заключается в том, чтобы позволить использовать if как форму условной компиляции, как объяснил Дэйв Ньютон в своем ответе.

+0

Хорошо, но я принял ответ @Dave Newton, так как он уже упомянул о хороших вещах. Большое спасибо. – Lion

Смежные вопросы