Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Preguntas sobre fechas | Main | Pregunta sobre excepciones »
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;
}
}
}
}

mayo 30, 2013 | Registered Commenterchoces

muy buena explicación señor @choces

mayo 30, 2013 | Registered Commenterjcarmonaloeches

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 bloque if.

mayo 31, 2013 | Registered CommenterGermanG

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

mayo 31, 2013 | Registered Commenterchoces

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?

junio 3, 2013 | Registered Commenterjcarmonaloeches

@ 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.

marzo 11, 2014 | Unregistered CommenterDany

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>