Saltar al contenido principal

while, do while, break y continue

Un for encaja cuando conocemos el recorrido. Otras veces la repetición depende de algo que cambia durante la ejecución: una respuesta, un saldo o una opción de menú. Para esos casos usamos while.

Repetir mientras se cumpla una condición​

int saldo = 30;

while (saldo >= 10) {
System.out.println("Compra de 10 euros");
saldo -= 10;
}

System.out.println("Saldo restante: " + saldo);

Antes de cada vuelta, Java comprueba saldo >= 10. Dentro del bucle modificamos saldo; si no cambiara, la condición seguiría siendo verdadera indefinidamente.

while puede ejecutarse cero veces:

int saldo = 5;

while (saldo >= 10) {
System.out.println("Esta línea no se muestra");
saldo -= 10;
}

Práctica inmediata​

Muestra una cuenta desde 1 hasta 5 con while:

int numero = 1;

while (numero <= 5) {
System.out.println(numero);
numero++;
}

Localiza las tres piezas conocidas: inicializamos antes, comprobamos en el encabezado y actualizamos dentro.

Centinelas: una señal para terminar​

Un centinela es un valor reservado que indica el final. Este programa suma números hasta recibir 0:

import java.util.Scanner;

public class SumaHastaCero {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int suma = 0;

System.out.print("Número (0 termina): ");
int numero = entrada.nextInt();

while (numero != 0) {
suma += numero;
System.out.print("Número (0 termina): ");
numero = entrada.nextInt();
}

System.out.println("Suma: " + suma);
entrada.close();
}
}

La primera lectura ocurre antes de entrar. Cada vuelta debe leer el siguiente valor para que el estado cambie.

do while: ejecutar antes de comprobar​

do while ejecuta el cuerpo y comprueba la condición después. Por eso siempre realiza al menos una vuelta:

int numero = 10;

do {
System.out.println(numero);
numero++;
} while (numero <= 5);

Aunque la condición es falsa desde el principio, se muestra 10. Observa el ; que cierra while (...).

Elige según la necesidad:

  • while: comprobar antes; puede haber cero vueltas.
  • do while: realizar la acción una vez y comprobar después.

Mini práctica: pedir una opción​

import java.util.Scanner;

public class OpcionValida {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int opcion;

do {
System.out.print("Elige 1, 2 o 3: ");
opcion = entrada.nextInt();
} while (opcion < 1 || opcion > 3);

System.out.println("Opción elegida: " + opcion);
entrada.close();
}
}

No usamos excepciones: asumimos que la persona introduce un entero y validamos su rango con condiciones.

Un menú que se repite​

import java.util.Scanner;

public class MenuConsola {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int opcion;

do {
System.out.println("1. Saludar");
System.out.println("2. Mostrar ayuda");
System.out.println("0. Salir");
System.out.print("Opción: ");
opcion = entrada.nextInt();

switch (opcion) {
case 1:
System.out.println("¡Hola!");
break;
case 2:
System.out.println("Elige una opción del menú.");
break;
case 0:
System.out.println("Hasta pronto");
break;
default:
System.out.println("Opción no válida");
}
} while (opcion != 0);

entrada.close();
}
}

El menú debe mostrarse al menos una vez, de modo que do while expresa bien el comportamiento.

Un bucle infinito controlado con break​

while (true) no termina por su condición. Necesita una salida clara:

int numero = 1;

while (true) {
if (numero > 5) {
break;
}
System.out.println(numero);
numero++;
}

break abandona inmediatamente el bucle más cercano. Conviene reservar este patrón para situaciones en las que la salida dentro del cuerpo resulte más clara que una condición en el encabezado.

Práctica con centinela y break​

Lee palabras hasta recibir fin:

import java.util.Scanner;

public class PalabrasHastaFin {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);

while (true) {
System.out.print("Palabra: ");
String palabra = entrada.nextLine();

if (palabra.equals("fin")) {
break;
}

System.out.println("Has escrito: " + palabra);
}

entrada.close();
}
}

Para comparar el contenido de textos usamos equals, como aprendiste en Java 0.

Saltar una vuelta con continue​

continue no termina el bucle: omite lo que queda de la vuelta actual y comienza la siguiente.

for (int numero = 1; numero <= 6; numero++) {
if (numero % 2 != 0) {
continue;
}
System.out.println(numero);
}

Los impares saltan el println; la salida es 2, 4 y 6.

Con while, actualiza el estado antes de un posible continue. Si lo haces después, podrías repetir siempre el mismo valor:

int numero = 0;

while (numero < 5) {
numero++;
if (numero == 3) {
continue;
}
System.out.println(numero);
}

Errores habituales​

  • No cambiar el estado del que depende la condición: provoca un bucle infinito.
  • Esperar que while se ejecute una vez aunque la condición inicial sea falsa.
  • Olvidar el ; final de do while.
  • Confundir break con continue: uno sale; el otro pasa a la siguiente vuelta.
  • Colocar la lectura del siguiente centinela fuera del bucle.

Ejercicio: registrar temperaturas​

Pide temperaturas enteras hasta que se introduzca 999. No incluyas el centinela en los cálculos. Muestra cuántas temperaturas se registraron y su suma. Si no se introduce ninguna, muestra un aviso.

Casos:

  • 18, 20, 999 → cantidad 2, suma 38.
  • 999 → ninguna temperatura.

Solución razonada​

import java.util.Scanner;

public class RegistroTemperaturas {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int cantidad = 0;
int suma = 0;

System.out.print("Temperatura (999 termina): ");
int temperatura = entrada.nextInt();

while (temperatura != 999) {
cantidad++;
suma += temperatura;

System.out.print("Temperatura (999 termina): ");
temperatura = entrada.nextInt();
}

if (cantidad == 0) {
System.out.println("No se registraron temperaturas");
} else {
System.out.println("Cantidad: " + cantidad);
System.out.println("Suma: " + suma);
}

entrada.close();
}
}

La lectura inicial permite decidir si entramos. La lectura final de cada vuelta actualiza el estado. En la siguiente unidad dividiremos programas como estos en operaciones más pequeñas mediante métodos.