Nieskończona pętla przerywa sygnaturę metody bez błędu kompilacji [duplikat]

To pytanie ma już odpowiedź tutaj:

Zastanawiam się, dlaczego poniższy kod jest dozwolony w Javie, bez błędu kompilacji? Moim zdaniem kod ten łamie podpis metody nie zwracając żadnej String. Czy ktoś może wyjaśnić, co mi umyka?

public class Loop {

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

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}
Author: xaizek, 2014-08-06

2 answers

Ostateczna } metody jest nieosiągalna - błąd kompilacji pojawia się tylko wtedy, gdy możliwe jest dotarcie do końca metody bez zwracania wartości.

Jest to bardziej przydatne w przypadkach, gdy koniec metody jest nieosiągalny z powodu wyjątku, np.

private String find(int minLength) {
    for (String string : strings) {
        if (string.length() >= minLength) {
            return string;
        }
    }
    throw new SomeExceptionIndicatingTheProblem("...");
}

Zasada jest w sekcji JLS 8.4.7:

Jeśli metoda jest zadeklarowana jako typ zwracany (§8.4.5), to występuje błąd w czasie kompilacji, jeśli ciało metody może wypełnić normalnie (§14.1).

Twoja metoda nie może zakończyć się normalnie, dlatego nie ma błędu. Co ważne, nie chodzi tylko o to, że nie może zakończyć się normalnie, ale specyfikacja rozpoznaje, że nie może zakończyć się normalnie. Z JLS 14.21:

A while twierdzenie może normalnie wypełnić iff co najmniej jedno z poniższych jest prawdziwe:

  • Instrukcja while jest osiągalna i wyrażenie warunkowe nie jest wyrażeniem stałym (§15.28) z wartością true.
  • istnieje osiągalne break oświadczenie, które kończy while oświadczenie.

W Twoim przypadku wyrażenie warunkowe jest stałą o wartości true i nie ma żadnych instrukcji break (osiągalnych lub innych), więc instrukcja while nie może być wykonana normalnie.

 83
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 06:13:01
 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
  }  

Aby uzyskać więcej wyjaśnień, spróbuj tego

private String withoutReturnStatement() {
    while(true) {}
    return ""; // unreachable
}

Mówi unreachable oświadczenie

 22
Author: Ruchira Gayan Ranaweera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 07:36:15