</>waridocu

Java

Control de flujo: if, for, while y switch

Cómo hacer que un programa decida y repita trabajo con if/else, for, while y switch.

javacontrol-de-flujoifforwhileswitch

El problema: un programa que siempre hace lo mismo

El ejemplo del IVA calcula un total y avisa si supera los $50, pero esa última parte es mentira a medias: el programa siempre imprime las tres líneas, sin importar el resultado. Para que realmente decida algo — mostrar un mensaje distinto según el caso, repetir un cálculo varias veces — hace falta control de flujo: instrucciones que alteran el orden en que el programa ejecuta el código, en vez de correr siempre de arriba a abajo.

if / else if / else

if se traduce literalmente como “si” — y significa exactamente eso, igual que en español: “si se cumple esto, haz aquello”. else se traduce como “si no” o “de lo contrario”. if ejecuta un bloque de código solo si una condición es verdadera:

Ejemplo: aprobado o nojava
public class Main {
    public static void main(String[] args) {
        int nota = 6;

        if (nota >= 6) {
            System.out.println("Aprobado");
        } else {
            System.out.println("Desaprobado");
        }
    }
}

La condición va entre paréntesis y tiene que ser un boolean — a diferencia de C++, en Java no se puede poner un int ahí esperando que 0 valga como falso y cualquier otro número como verdadero. if (nota) directamente no compila si nota es un int.

Para más de dos casos, else if los encadena:

javajava
int nota = 8;

if (nota >= 9) {
    System.out.println("Excelente");
} else if (nota >= 6) {
    System.out.println("Aprobado");
} else {
    System.out.println("Desaprobado");
}

Java evalúa las condiciones en orden y ejecuta la primera que dé verdadera; el resto ni se evalúa. Por eso el orden importa: si nota >= 6 fuera la primera condición, un 9 también entraría ahí y nunca llegaría a “Excelente”.

Nota

Las llaves { } son opcionales cuando el bloque tiene una sola instrucción, pero es una fuente clásica de bugs: si más adelante agregas una segunda línea y te olvidas de agregar las llaves, esa línea queda fuera del if sin que el compilador se queje. Escribir las llaves siempre, aunque sea una sola línea, evita ese problema por completo.

El bucle for

for se traduce literalmente como “para” (la preposición), pero aquí no funciona como preposición: es el nombre de esta estructura de repetición en particular, heredado de lenguajes más viejos que Java. Piénsalo como una cinta de correr con un contador de vueltas incorporado: for repite un bloque un número de veces controlado por ese contador. Tiene tres partes separadas por ;: inicialización, condición, incremento.

Ejemplo: contar del 1 al 5java
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
        }
    }
}
texttext
1
2
3
4
5
  • int i = 1 se ejecuta una sola vez, antes de empezar.
  • i <= 5 se revisa antes de cada vuelta; si da false, el bucle termina.
  • i++ se ejecuta al final de cada vuelta, antes de volver a chequear la condición.
Advertencia

Un error clásico es escribir i <= 5 cuando la intención era recorrer 5 elementos empezando en 0 (por ejemplo, un array): eso da 6 vueltas (0 a 5), no 5. Cuenta siempre con cuidado los bordes de la condición.

El bucle while y do-while

while se traduce literalmente como “mientras” — y, a diferencia de for, esta sí es una traducción directa y útil: while repite un bloque mientras una condición siga siendo verdadera, sin la estructura fija de tres partes del for. Es más natural cuando no sabes de antemano cuántas vueltas van a hacer falta — por ejemplo, “mientras el usuario no ingrese el código correcto, sigue preguntando”:

javajava
int intentos = 0;
int maximo = 3;

while (intentos < maximo) {
    System.out.println("Intento " + (intentos + 1));
    intentos++;
}

do-while es igual, pero revisa la condición al final: el bloque se ejecuta al menos una vez, siempre, incluso si la condición ya era falsa desde el principio.

javajava
int codigo;
Scanner teclado = new Scanner(System.in);

do {
    System.out.print("Ingresa el código (1234 para salir): ");
    codigo = teclado.nextInt();
} while (codigo != 1234);

Esta variante es la forma natural de escribir “pide un dato, y si no es válido, vuelve a pedirlo” — la primera vez todavía no hay nada que validar, así que el bloque tiene que correr sin condición previa.

switch

switch se traduce literalmente como “interruptor” — el mismo objeto que prende y apaga la luz, aunque aquí es más parecido a un dial con varias posiciones que a un interruptor de solo dos. case significa “caso”, y default significa “por defecto” (lo que pasa si ninguno de los casos coincide). switch compara un valor contra una lista de casos posibles y “gira el dial” hacia el case que coincide. Es más claro que una cadena larga de else if cuando todas las comparaciones son contra el mismo valor:

javajava
int diaSemana = 3;
String nombre;

switch (diaSemana) {
    case 1:
        nombre = "Lunes";
        break;
    case 2:
        nombre = "Martes";
        break;
    case 3:
        nombre = "Miércoles";
        break;
    default:
        nombre = "Otro día";
        break;
}

System.out.println(nombre);
Importante

break se traduce literalmente como “romper” o “cortar” — y hace justamente eso: corta la ejecución al final de cada case, como el interruptor de emergencia (breaker) que corta la corriente eléctrica. Si se te olvida, Java sigue ejecutando el case siguiente aunque no coincida — este comportamiento se llama fall-through y es una de las trampas más conocidas del lenguaje (la hereda de C). En el ejemplo, sacar el break del case 2 haría que, con diaSemana = 2, nombre termine valiendo “Miércoles” en vez de “Martes”.

Desde Java 14 existe una forma más nueva, el switch expression, que no tiene fall-through y devuelve un valor directamente:

javajava
String nombre = switch (diaSemana) {
    case 1 -> "Lunes";
    case 2 -> "Martes";
    case 3 -> "Miércoles";
    default -> "Otro día";
};

Con -> cada caso ejecuta una sola expresión y no necesita break: nunca hay fall-through, y el resultado se asigna directamente a nombre. Para código nuevo, esta forma suele preferirse por eso mismo.

Pon a prueba

💡 Predice la salida

¿Qué imprime este programa? Presta atención al break que falta.

javajava
int nota = 2;
switch (nota) {
    case 1:
        System.out.println("Uno");
    case 2:
        System.out.println("Dos");
    case 3:
        System.out.println("Tres");
        break;
    default:
        System.out.println("Otro");
}

Imprime Dos y después Tres. Como nota vale 2, la ejecución arranca en case 2:, pero ese case no tiene break — así que sigue de largo (fall-through) hacia case 3:, imprime “Tres”, y ahí sí encuentra un break que corta. El case 1: nunca se evalúa porque switch salta directo al caso que coincide, no lee desde arriba.

🧩 Ordena el código

Ordena las líneas para imprimir solo los números pares del 1 al 10.

  1. }
  2. for (int i = 1; i <= 10; i++) {
  3. if (i % 2 == 0) {
  4. System.out.println(i);
  5. }

Siguiente paso

Repetir el mismo bloque de código copiado y pegado en varios lugares del programa no escala. El siguiente paso natural es empaquetar ese código en un método para poder reutilizarlo — ver Métodos: parámetros, retorno y sobrecarga.