Spójrz na następującą nieskończoną whilepę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 whilepę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 bjest prawdziwa, a kompilator w ogóle nie narzeka. Czemu?
Edycja: Następująca wersja whileutknęła w nieskończonej pętli, co jest oczywiste, ale nie powoduje błędów kompilatora dla instrukcji poniżej, mimo że ifwarunek w pętli jest zawsze falseiw 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 ifi 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 whileró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 returninstrukcja napotyka go wcześniej w samym trybloku.