Se trata de dos instrucciones que permiten modificar el comportamiento de otras estructuras o sentencias de control, simplemente por el hecho de estar incluidas en algún punto de su secuencia de instrucciones.
La sentencia break incidirá sobre las estructuras de control switch, while, for y do-while del siguiente modo:
- Si aparece una sentencia break dentro de la secuencia de instrucciones de cualquiera de las estructuras mencionadas anteriormente, dicha estructura terminará inmediatamente.
- Si aparece una sentencia b
reak dentro de un bucle anidado sólo finalizará ejecución del bucle más interno en el que se encuentra, el resto se ejecuta de forma normal.
Es decir, que break sirve para romper el flujo de control de un bucle, aunque no se haya cumplido la condición del bucle. Si colocamos un break dentro del código de un bucle, cuando se alcance el break, automáticamente se saldrá del bucle pasando a ejecutarse la siguiente instrucción inmediatamente después de él.
Aquí tienes un ejemplo de cómo se utilizaría la sentencia break dentro de un bucle for.
/**
* Ejemplo de uso de la sentencia de salto break
*/
public class SentenciaBreak {
public static void main(String[] args) {
// Declaración de variables
int contador;
1
//Procesamiento y salida de información
/* Este bucle sólo se ejecutará en 6 ocasiones, ya que cuando
* la variable contador sea igual a 7 encontraremos un break que
* romperá el flujo del bucle, transfiriéndonos el control a la
* sentencia que imprime el mensaje de Fin del programa.
*/
for (contador=1;contador<=10;contador++){
if (contador==7)
break;
System.out.println ("Valor: " + contador); // Es una forma muy inapropiada de salir del bucle!!
}
System.out.println ("Fin del programa");
}
}
¡Recuerda!
Debemos saber cómo funciona break, pero su uso, salvo en el caso del switch, donde es obligado usarlo para evitar una "ejecución en cascada", se desaconseja, y siempre es evitable.
La salida de cualquier ciclo usando break es en general una mala práctica de programación, que esconde una mala planificación de la lógica asociada al ciclo. La salida natural y única de cada ciclo debe ser comprobando la condición de control del mismo, único punto donde debemos comprobar si ha llegado o no el momento de terminarlo. Cualquier comprobación de cualquier condición de salida dentro del cuerpo del bucle para forzar la salida del bucle desde el interior del mismo usando break, debería haberse incorporado a la condición de control del mismo, y supone ir abriendo puertas traseras de salida que hacen que el código se haga cada vez más complicado de entender y mantener. ¡¡Evita usar break siempre que sea posible!! Y salvo el caso de switch, siempre es posible.
La sentencia continue incidirá sobre las sentencias o estructuras de control while, for y do-while del siguiente modo:
- Si aparece una sentencia continue dentro de la secuencia de instrucciones de cualquiera de las sentencias anteriormente indicadas, dicha sentencia dará por terminada la iteración actual y se ejecuta una nueva iteración, evaluando de nuevo la expresión condicional del bucle.
- Si aparece en el interior de un bucle anidado solo detendrá la ejecución de la iteración del bucle más interno en el que se encuentra, el resto se ejecutaría de forma normal.
Es decir, la sentencia continue forzará a que se ejecute la siguiente iteración del bucle, ignorando y saltándose las instrucciones que pudiera haber después del continue, y hasta el final del código del bucle, para esta iteración.
Aquí tienes un ejemplo de cómo se utilizaría la sentencia continue dentro de un bucle for para mostrar por pantalla los números pares que hay entre el 1 y el 10:
/**
* Ejemplo de uso de la sentencia de salto continue
*/
public class EjemploSentenciaContinue {
public static void main(String[] args) {
// Declaración de variables
int contador;
//Procesamiento y salida de información
System.out.println ("Imprimiendo los números pares que hay del 1 al 10... ");
for (contador=1;contador<=10;contador++){
if (contador % 2 != 0)
continue;
System.out.print(contador + " ");
}
System.out.println ("\nFin del programa");
/* Las iteraciones del bucle que generarán la impresión de cada uno de los números
* pares, serán aquellas en las que el resultado de calcular el resto de la división
* entre 2 de cada valor de la variable contador, sea igual a 0.
*/
}
}
¡¡Recuerda!!
Con la sentencia continue, también se desaconseja el uso. Igual que pasaba con el uso de break, es en general una mala práctica de programación, que esconde un mal diseño de la lógica asociada al ciclo. De hecho, la sentencia continue, como en el ejemplo de la imagen anterior, se pondría dentro de un if para que se ejecute dependiendo de una condición. La sentencia continue lo que hace implícitamente de hecho, es meter las demás sentencias que siguen a partir de ella en una "invisible" cláusula else del condicional, ya que sólo serán alcanzables y ejecutables en el caso de que la condición sea falsa y por tanto no se ejecute continue. Si un grupo de sentencias del bucle deben dejar de ejecutarse bajo ciertas circunstancias, lo que hay que hacer es incluirlas en un condicional que compruebe dicha condición, y que se salte esas sentencias cuando sea oportuno.
Para clarificar algo más el funcionamiento de ambas sentencias de salto, vuelve a mirar detenidamente el diagrama representativo del comienzo de este epígrafe.