Curiosidades Java: Break y Continue
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 😉
Me salvó tu post con un programa del mal 🙂 gracias
De nada 😉
Muchas gracias, bien explicado y buenos ejemplos 😉
¡Gracias! Aprendí con tu post 😀
Genial muchas gracias!
k onda men gracias por la aportacion, jejej ya casi me desesperaba men..gracias por la info
exelente gracias!!
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…
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 😉
MUCHAASSS GRACIAAAASSSS!!!! me has salvado!
excelente gracias… me has salvado la vida… ¿puedo postearlo en mi wordpress? con los debidos creditos claro.
Saludos
Claro que sí. 😉
Excelente post! (Y)
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!
Muy servible, gracias, me aclare muchas dudas
Mil gracias, muy útil.
gracias, fue de mucha ayuda
Excelente, gracias.
Gracias :D!
Muy buenos ejemplos y claras explicaciones.
Muchas gracias 🙂
No sabía que se pudieran usar etiquetas con estas sentencias.
Su uso habría facilitado algunos códigos que hice.
Por cierto, muchas gracias por la explicación.
Me fue bastante útil.
Muchas gracias por el post. He entendido todo.
Perefecto
muy bien explicado men,gracias.
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