Schauen Sie sich die folgende while
Endlosschleife in Java an. Es verursacht einen Kompilierungsfehler für die Anweisung darunter.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
Die folgende while
Endlosschleife funktioniert jedoch einwandfrei und gibt keine Fehler aus, bei denen ich die Bedingung nur durch eine boolesche Variable ersetzt habe.
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
Auch im zweiten Fall ist die Anweisung nach der Schleife offensichtlich nicht erreichbar, da die boolesche Variable b
wahr ist und der Compiler sich überhaupt nicht beschwert. Warum?
Bearbeiten: Die folgende Version von while
bleibt als offensichtlich in einer Endlosschleife stecken, gibt jedoch keine Compilerfehler für die Anweisung darunter aus, obwohl die if
Bedingung innerhalb der Schleife immer ist false
und folglich die Schleife niemals zurückkehren kann und vom Compiler am festgelegt werden kann Kompilierungszeit selbst.
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.
Edit: Gleiches mit if
und 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.
}
Die folgende Version von while
bleibt auch in einer Endlosschleife stecken.
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
Dies liegt daran, dass der finally
Block immer ausgeführt wird, obwohl die return
Anweisung innerhalb des try
Blocks selbst auf ihn trifft .