Бесконечный цикл разрывает сигнатуру метода без ошибки компиляции [дубликат]
этот вопрос уже есть ответ здесь:
мне интересно, почему следующий код разрешен в Java, без получения ошибки компиляции?
На мой взгляд, этот код нарушает подпись метода, не возвращая никаких String
.
Может кто-нибудь объяснить чего мне здесь не хватает?
public class Loop {
private String withoutReturnStatement() {
while(true) {}
}
public static void main(String[] a) {
new Loop().withoutReturnStatement();
}
}
2 ответа:
финал
}
метода недостижимо - вы получаете только ошибку компиляции, если можно добраться до конца метода, не возвращая значение.это более полезно для случаев, когда конец метода недоступен из-за исключения, например
private String find(int minLength) { for (String string : strings) { if (string.length() >= minLength) { return string; } } throw new SomeExceptionIndicatingTheProblem("..."); }
правило для этого находится в JLS раздел 8.4.7:
если метод объявлен с типом возвращаемого значения (§8.4.5) , то ошибка времени компиляции происходит, если тело метода может завершиться нормально (§14.1).
ваш метод не может завершить нормально, следовательно, нет никакой ошибки. Важно отметить, что это не только то, что он не может завершить нормально, но спецификация признает что он не может нормально завершить. От JLS 14.21:
A
while
оператор может завершить нормально, если хотя бы одно из следующих значений истинно:
- The
while
оператор достижим, и выражение условия не является константным выражением (§15.28) со значениемtrue
.- есть достижимое
break
оператор, который выходитwhile
заявление.в вашем случае выражение условия и константа со значением
true
и нетbreak
заявления (можно или нет) так чтоwhile
оператор не может завершить нормально.
private String withoutReturnStatement() { while(true) { // you will never come out from this loop } // so there will be no return value needed // never reach here ===> compiler not expecting a return value }
для большего уточнения попробуйте это
private String withoutReturnStatement() { while(true) {} return ""; // unreachable }
Он говорит:
unreachable
сообщении