Nieskończona pętla przerywa sygnaturę metody bez błędu kompilacji [duplikat]
To pytanie ma już odpowiedź tutaj:
- Brak instrukcji return w metodzie non-void kompiluje 13 Odpowiedzi
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();
}
}
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ńczywhile
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.
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
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