Бесконечный цикл разрывает сигнатуру метода без ошибки компиляции [дубликат]


этот вопрос уже есть ответ здесь:

мне интересно, почему следующий код разрешен в Java, без получения ошибки компиляции? На мой взгляд, этот код нарушает подпись метода, не возвращая никаких String. Может кто-нибудь объяснить чего мне здесь не хватает?

public class Loop {

  private String withoutReturnStatement() {
    while(true) {}
  }

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}
2 65

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 сообщении