jueves
may302013
¿Cuál es la salida del siguiente programa y por qué?
public class Pruebas {
/**
* @param args
*/
public static void main(String[] args) {
boolean a = true;
boolean b = true;
__main:
{
if (a == true) {
System.out.println("dentro del main: a es verdadero");
System.out.println("ejecutamos break __main");
break __main;
} else {
System.out.println("dentro del main: a es falso");
}
if (b == true) {
System.out.println("dentro del main: b es verdadero");
} else {
System.out.println("dentro del main: b es falso");
}
}
System.out.println("fuera del bloque __main");
} // end main
}
Reader Comments (6)
La sintaxis es algo confusa debido al uso de esos {} que engloba la etiqueta __main
Puesto que el break hace referencia a __main, se interrumpe la ejecución del bloque interno dentro de esos {}, y tras las salidas de consola correspondientes a a==true, ejecuta la salida final "fuera del bloque".
Hay un uso habitual de etiquetas, cuando se usan bucles anidados, como en el siguiente ejemplo:
public class Pruebas {
public static void main(String[] args) {
externo:
for (int i = 0; i < 5; i++) {
interno:
for (int j = 0; j < 5; j++) {
if (j == 4) {
System.out.println("j=4 para i=" + i);
break interno;
}
}
if (i == 3) {
System.out.println("i=3");
break externo;
}
}
}
}
muy buena explicación señor @choces
Interesante,
Groovy (version 1.8.6) reclama al intentar compilar.
Tomando el código y guardándolo como
Pruebas.groovy
, al invocar a:groovy Pruebas.groovy
El compilador indica el siguiente mensaje:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/german/borrar/Pruebas.groovy: 13: the break statement with named label is only allowed inside loops
@ line 13, column 3.
break __main;
^
1 error
Lo que me parece una buena práctica. Sólo permitir usar etiquetas en java para salir de bloques dentro de un loop (
while, for
) y no desde un bloqueif
.No me disgusta la especificación de Java sobre etiquetas. Lo que sí es cierto es que, si no se comprende, o no se usa bien, puede dar lugar a un código confuso.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.7
Puedo estar equivocado, ¿pero un objetivo de los nuevos lenguajes no era eliminar la programación a saltos? Además, pudiendo simular el comportamiento vía condiciones lógicas, ¿por qué la necesidad de mantener las etiquetas?
¿Alguien recuerda Basic: línea 11: si metes un gol, goto linea 75, si fallas el penalty, go to linea 40?
@ jcarmonaloeches Afortunada o desafortunamente existen casos en los que el salto, llamdo salto incondicional; es requerido y el principal ejemplo es en el uso del switch (o como ya mencionaron, los bucles anidados). Lo malo es el abuso de etiquetas y saltos "incondicionales" en un programa que no los necesita y donde invertir 5 min mas de sesos lo haria mas legible y mejor estructurado.