Saltar al contenido

Curiosidades Java: Break y Continue

11 abril 2009

Las palabras reservadas break y continue, se utilizan en Java para detener completamente un bucle (break) o detener únicamente la iteración actual y saltar a la siguiente (continue). Normalmente si usamos break o continue, lo haremos dentro de una sentencia if, que indicará cuándo debemos detener el bucle al cumplirse o no una determinada condición.

La gran diferencia entre ambos es que, break, detiene la ejecución del bucle y salta a la primera línea del programa tras el bucle y continue, detiene la iteración actual y pasa a la siguiente iteración del bucle sin salir de él (a menos, que el propio bucle haya llegado al límite de sus iteraciones).

NOTA: La sentencia continue debe estar siempre incluida dentro de un bucle, sino recibiréis un error de compilación. Mientras que la sentencia break, podemos encontrarla dentro de un bucle o en una sentencia switch. (Aunque esta regla no la aplicamos a los break con etiqueta, ahora lo veremos)

La sentencia continue provoca que únicamente la iteración actual del bucle más interno detenga su ejecución y que comience inmediatamente la siguiente iteración si el bucle todavía no ha terminado. Por ejemplo:

for (int i = 0; i < 10; i++) {
  System.out.println("Dentro del bucle");
  continue;
  System.out.println("Nunca lo escribira");
}

Cada vez que el programa alcance la sentencia continue, saltará a una nueva iteración del bucle y por tanto la última sentencia System.out.println nunca llegará a escribirse. El resultado del programa será escribir 10 veces «Dentro del bucle».

Sin embargo, la sentencia break provoca que el programa detenga la ejecución del bucle más interno y continúe la ejecución desde la primera línea de código que se encuentre tras el bucle. Por ejemplo:

for (int i = 0; i < 10; i++) {
  System.out.println("Dentro del bucle");
  break;
  System.out.println("Nunca lo escribira");
}
System.out.println("Tras el bucle");

Cuando el programa alcance la sentencia break, detendrá la ejecución del bucle y saldrá de él. Por tanto el resultado de la ejecución del programa será:

"Dentro del Bucle"
"Tras el bucle"

El bucle for, sólo ejecuta una iteración y después termina, continuando el programa desde la primera línea tras el bucle.

Las sentencias break y continue pueden llevar asociada una etiqueta (Labeled) o no (Unlabeled). Vamos a ver ambos casos:

Sentencia sin etiqueta (Unlabeled)

Este es el uso más común que solemos hacer de las etiquetas break y continue. Los ejemplos que hemos visto hasta ahora son ejemplos claros de sentencias sin etiqueta. Veamos un par de ejemplos más:

Break:

boolean problema = true;
while (true) {
  if (problema) {
    System.out.println("There was a problem");
    break;
  }
}
// Siguiente línea de código

Continue:

while (!EOF) {
  //leemos un campo de un fichero
  if (wrongField) {
    continue;    // vamos al siguiente campo
  }
  // procesamos el campo
}

Sentencia con etiqueta (Labeled)

Hay muchas sentencias en un programa en Java que pueden ser etiquetadas, pero su uso más común es con los bucles for y while, asociadas a break y continue. Una etiqueta debe ir colocada justo antes del bucle al que va etiquetando y se forma con un identificador válido seguido de dos puntos (:).

Hay que tener muy clara la diferencia entre usar sentencias break y continue con etiquetas a usar sentencias break y continue sin etiquetar. El uso de las sentencias break y continue con etiquetas, será necesario cuando tengamos varios bucles anidados y necesitemos indicar cual es el bucle anidado que debe continuar su ejecución tras romper el flujo normal de ejecución del programa. Por ejemplo:

bucle1:
for (int i = 0; i < 10; i++) {
  System.out.println("Bucle i. i = "+i);
  for (int j = 0; j < 10; j++) {
    System.out.println("Bucle j. j = "+j);
    for (int k = 0; k < 10; k++) {
      System.out.println("Bucle k. k = "+k);
      break bucle1;
    }
  }
}

En esta ocasión la salida del programa sería:

"Bucle i. i = 0"
"Bucle j. j = 0"
"Bucle k. k = 0"

El programa comienza la ejecución en el primer bucle for. Ejecuta la primera iteración y entra en el bucle for anidado de «j». Realiza la primera iteración y entra en el bucle for anidado de «k». Aquí nuevamente ejecuta la primera iteración y se encuentra con una sentencia break. (Recordad que break, detiene la ejecución del bucle y provoca que el programa continúe desde la primera línea depués del bucle). Pero en este caso es una sentencia break con etiqueta, por tanto, continuará con la primera línea tras el bucle que está indicado por la etiqueta. Y en esta ocasión es el bucle for de «i»; de esta forma, al ejecutar esta sentencia break, provocamos el que programa deje de ejecutar el resto de iteraciones de los tres bucles for anidados.

Veamos un ejemplo con una sentencia continue.

fuera:
  for (int i=0; i<5; i++) {
    for (int j=0; j<5; j++) {
      System.out.println("Dentro");
      continue fuera;
    } // fin del bucle anidado
    System.out.println("fuera"); // nunca lo escribe
  }
System.out.println("Fuera del bucle");

La salida que obtenemos tras la ejecución del código anterior es:

Dentro
Dentro
Dentro
Dentro
Dentro
Fuera del bucle

Veamos porqué.

Después de que se ejecute la sentencia continue, el flujo de ejecución continúa ejecutando la siguiente iteración del bucle for identificado por la etiqueta, hasta que éste alcance la condición de parada. Finalmente, cuando la condición de parada del bucle se alcanza, el bucle termina y se escribirá «Fuera del Bucle». Si en lugar de poner una sentencia continue, hubieramos puesto un break, el resultado hubiera sido:

Dentro
Fuera del bucle

NOTA: Las sentencias break y continue con etiquetas, deben estar dentro del bucle que tiene la misma etiqueta, de otra forma, el codigo no compilará.

Más Info:

Si queréis indagar con más detalle en los diversos aspectos del comportamiento de Java, hay un libro que utilicé para prepararme la certificación de Java y que os recomiendo encarecidamente ya que explica cada aspecto del lenguaje con un nivel de detalle bastante exhaustivo:

Y ya sabéis, cualquier duda, sugerencia, mejora, … será siempre bien recibida 😉

26 comentarios leave one →
  1. Monike permalink
    2 octubre 2009 08:53

    Me salvó tu post con un programa del mal 🙂 gracias

  2. Carlis permalink
    28 marzo 2010 15:48

    Muchas gracias, bien explicado y buenos ejemplos 😉

  3. 4 abril 2010 22:48

    ¡Gracias! Aprendí con tu post 😀

  4. Gustavo permalink
    8 May 2010 18:54

    Genial muchas gracias!

  5. ramyro permalink
    31 May 2010 06:38

    k onda men gracias por la aportacion, jejej ya casi me desesperaba men..gracias por la info

  6. Henry permalink
    21 junio 2010 20:12

    exelente gracias!!

  7. 9 diciembre 2010 23:08

    Hola rekkeb, gracias por tu post!!

    Tengo una compañera que me dice que el uso del break y el continue es horrible y debería evitarse a toda costa, pero la verdad no tiene un argumento sólido que me persuada de evitar su uso excepto que por estética,

    En cuanto al funcionamiento interno de la JVM o la versión de java tiene alguna implicación??

    Agradezco tu respuesta…

    • rekkeb permalink*
      10 diciembre 2010 00:07

      Hombre desde el punto de vista de la programación estructurada, el hecho de utilizar break en el código puede desentonar un poco, y como bien dices, puede quedar poco estético, ya que rompe con el paradigma de ese modelo de programación. Pero desde el punto de vista del rendimiento, me parece una opción excelente el utilizar un break o continue para detener un bucle for (por ejemplo) y evitar que siga consumiendo ciclos de CPU.
      En cuanto a la versión de la JVM, en principio debe comportarse del mismo modo sea cual sea la versión que utilices, yo en particular no he notado ninguna diferencia…aunque tampoco he hecho un análisis en profundidad, también es cierto 😉

  8. Oberol permalink
    17 febrero 2011 07:29

    MUCHAASSS GRACIAAAASSSS!!!! me has salvado!

  9. 22 marzo 2011 20:11

    excelente gracias… me has salvado la vida… ¿puedo postearlo en mi wordpress? con los debidos creditos claro.

    Saludos

  10. 11 May 2011 00:06

    Excelente post! (Y)

  11. Juan Carlos Zepeda permalink
    13 junio 2011 10:40

    que excelente post!…no sabia de las sentencias con etiqueta, pense que solamente en la programacion en ensamblador se podia hacer…pero este post esta muy bien explicado! excelente!

  12. 15 septiembre 2011 04:55

    Muy servible, gracias, me aclare muchas dudas

  13. Gonzalo permalink
    24 agosto 2012 17:24

    Mil gracias, muy útil.

  14. Zarkas permalink
    24 octubre 2012 23:23

    gracias, fue de mucha ayuda

  15. asdasda permalink
    12 abril 2013 05:10

    Excelente, gracias.

  16. Gary permalink
    9 May 2013 23:41

    Gracias :D!

  17. Mtuni permalink
    28 octubre 2013 10:56

    Muy buenos ejemplos y claras explicaciones.
    Muchas gracias 🙂

  18. Freddy permalink
    24 diciembre 2013 20:21

    No sabía que se pudieran usar etiquetas con estas sentencias.

    Su uso habría facilitado algunos códigos que hice.

    • Freddy permalink
      24 diciembre 2013 20:22

      Por cierto, muchas gracias por la explicación.

      Me fue bastante útil.

  19. llulian permalink
    23 abril 2014 08:42

    Muchas gracias por el post. He entendido todo.

  20. diegodesdecolombia permalink
    29 julio 2015 18:14

    Perefecto

  21. roberto permalink
    28 octubre 2015 04:48

    muy bien explicado men,gracias.

  22. 3dgar permalink
    26 junio 2016 21:00

    Hola, en los primeros ejemplos que tienes nos producirá un error de compilación ya que la ultima sentencia después de «continue» y «break» son inalcanzables

Deja un comentario