Spójrz na następującą nieskończoną while
pętlę w Javie. Powoduje to błąd w czasie kompilacji dla instrukcji poniżej.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
Poniższa sama nieskończona while
pętla działa jednak dobrze i nie powoduje żadnych błędów, w których właśnie zastąpiłem warunek zmienną boolowską.
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
Również w drugim przypadku instrukcja po pętli jest oczywiście nieosiągalna, ponieważ zmienna boolowska b
jest prawdziwa, a kompilator w ogóle nie narzeka. Czemu?
Edycja: Następująca wersja while
utknęła w nieskończonej pętli, co jest oczywiste, ale nie powoduje błędów kompilatora dla instrukcji poniżej, mimo że if
warunek w pętli jest zawsze false
iw konsekwencji pętla nigdy nie może powrócić i może zostać określona przez kompilator w sam czas kompilacji.
while(true) {
if(false) {
break;
}
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
while(true) {
if(false) { //if true then also
return; //Replacing return with break fixes the following error.
}
System.out.println("inside while");
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
while(true) {
if(true) {
System.out.println("inside if");
return;
}
System.out.println("inside while"); //No error here.
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
Edycja: to samo z if
i while
.
if(false) {
System.out.println("inside if"); //No error here.
}
while(false) {
System.out.println("inside while");
// Compiler's complain - unreachable statement.
}
while(true) {
if(true) {
System.out.println("inside if");
break;
}
System.out.println("inside while"); //No error here.
}
Następująca wersja while
również utknęła w nieskończonej pętli.
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
To dlatego, że finally
blok jest zawsze wykonywany, mimo że return
instrukcja napotyka go wcześniej w samym try
bloku.