Соответствующие разделы JLS: Сек. 8.4.7 Тело метода ;соответствующая часть этого:
Если объявлен метод с возвращаемым типом (§8.4.5), то возникает ошибка времени компиляции, если тело метода может завершиться нормально (§14.1).
( «завершить как обычно» - это слегка запутанная терминология; в основном это означает выполнение без выполнения операторов return
, throw
или System.exit
)
и Sec 14.21, Недоступные заявления .Соответствующая часть этого:
Непустой блок, который не является блоком переключателя, может нормально завершиться, если последний оператор в нем может завершиться нормально.
...
Базовый оператор for может обычно завершаться, если хотя бы одно из следующих условий верно:
- Оператор for достижим, есть выражение условия и выражение условия не являетсяконстантное выражение (§15.28) со значением true.
- Существует оператор достижимости break, который выходит из оператора for.
Содержащийся оператор достижим, если оператор for достижим, а операторВыражение условия не является константным выражением со значением false.
Внутренний цикл на самом деле не имеет отношения к поведению: вы увидите точно такое же поведение с:
public String testFor() {
// Compiler error if you uncomment the condition.
for(int i = 0; /* i<10 */; i++) {
}
}
Без условия ни одно из маркированных условий не выполняется, поэтому цикл не может завершиться нормально;как таковой, он не может достичь после цикла.Таким образом, оператор return
(или throw
или System.exit
) не требуется.
Если добавить условие i<10
, это не константа времени компиляции, поэтому цикл может завершиться нормально,Таким образом, вам нужно добавить оператор return
(или throw
или System.exit
) после цикла.