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
whilese ejecute una vez aunque la condición inicial sea falsa. - Olvidar el
;final dedo while. - Confundir
breakconcontinue: 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→ cantidad2, suma38.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.