Mira el siguiente while
bucle infinito en Java. Provoca un error en tiempo de compilación para la declaración que se encuentra debajo.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
while
Sin embargo, el siguiente mismo bucle infinito 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 booleana b
es verdadera, pero el compilador no se queja en absoluto. ¿Por qué?
Editar: la siguiente versión de while
se atasca en un bucle infinito como obvio, pero no emite errores de compilador para la declaración que se encuentra debajo, aunque la if
condición dentro del bucle es siempre false
y, en consecuencia, el bucle nunca puede regresar y puede ser determinado por el compilador en el el propio 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.
Editar: Lo mismo con if
y 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.
}
La siguiente versión de while
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 se debe a que el finally
bloque siempre se ejecuta aunque la return
instrucción se encuentre antes que él dentro del try
bloque mismo.