Infinite loops en Java
Mire la siguiente @ infiniwhile
loop en Java. Provoca un error en tiempo de compilación para la siguiente declaración.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
El siguiente mismo infinitowhile
loop, sin embargo, funciona bien y no emite ningún error en el que acabo de reemplazar la condición con una variable booleana.
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
En el segundo caso también, la declaración después del ciclo es obviamente inalcanzable porque la variable booleanab
es cierto aún el compilador no se queja en absoluto. ¿Por qué
Edit: La siguiente versión dewhile
se atasca en un bucle infinito como es obvio pero no emite errores de compilación para la siguiente declaración a pesar de queif
a condición @ dentro del bucle siempre esfalse
y, en consecuencia, el bucle nunca puede volver y puede ser determinado por el compilador en el mismo tiempo de compilación.
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: Lo mismo conif
ywhile
.
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.
}
La siguiente versión dewhile
también se atasca en un bucle infinito.
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
Esto es porque elfinally
l bloque @ siempre se ejecuta aunque elreturn
a declaración @ se encuentra ante ella dentro de latry
bloque en sí mismo.