Control de flujo

if/else y switch

if / else if / else

La sintaxis es estándar C-like. Destacan los operadores lógicos con cortocircuito (&&, ||): si el primer operando determina el resultado, el segundo no se evalúa — útil para evitar NPE en cadenas de condiciones.

// if / else if / else — igual que en otros lenguajes C-like
int nota = 75;

if (nota >= 90) {
    System.out.println("Sobresaliente");
} else if (nota >= 70) {
    System.out.println("Notable");
} else if (nota >= 50) {
    System.out.println("Aprobado");
} else {
    System.out.println("Suspenso");
}

// Operador ternario: condición ? valorTrue : valorFalse
String resultado = nota >= 50 ? "Aprobado" : "Suspenso";

// Operador AND (&&), OR (||), NOT (!) — cortocircuito
boolean esMayor = edad >= 18;
boolean tienePermiso = esMayor && !estaBloqueado; // si esMayor es false, no evalúa lo demás

switch clásico

El switch de Java 8 acepta int (y sus wrappers), char, String y enums. Importante: sin break, la ejecución continúa (fall-through) hacia el siguiente case — comportamiento que puede usarse intencionalmente o causar bugs sutiles.

// switch clásico en Java 8: sobre int, char, String o enum
String dia = "LUNES";

switch (dia) {
    case "LUNES":
    case "MARTES":
    case "MIERCOLES":
    case "JUEVES":
    case "VIERNES":
        System.out.println("Día laborable");
        break;             // sin break: "fall-through" al siguiente case
    case "SABADO":
    case "DOMINGO":
        System.out.println("Fin de semana");
        break;
    default:
        System.out.println("Día desconocido");
}

switch con enums

El switch sobre enums es especialmente valioso porque el compilador puede advertir si falta algún valor del enum (dependiendo del IDE/herramienta de análisis estático). Las referencias a los valores del enum no llevan el nombre de la clase dentro del switch.

// switch con enum: el compilador verifica que todos los casos están cubiertos
public enum Estado { PENDIENTE, PROCESANDO, COMPLETADO, CANCELADO }

Estado estado = Estado.PROCESANDO;

switch (estado) {
    case PENDIENTE:
        iniciarProcesamiento();
        break;
    case PROCESANDO:
        verificarProgreso();
        break;
    case COMPLETADO:
        notificarExito();
        break;
    case CANCELADO:
        limpiarRecursos();
        break;
    // sin default necesario: todos los valores del enum están cubiertos
}

Fall-through intencional

El fall-through es un patrón válido cuando múltiples casos comparten el mismo cuerpo. Agrupar los case vacíos seguidos del que tiene el cuerpo es más legible que repetir el código.

// Fall-through: si no hay break, la ejecución continúa en el siguiente case
int mes = 2;
int diasEnMes;

switch (mes) {
    case 1: case 3: case 5: case 7:
    case 8: case 10: case 12:
        diasEnMes = 31;
        break;
    case 4: case 6: case 9: case 11:
        diasEnMes = 30;
        break;
    case 2:
        diasEnMes = 28; // ignorando años bisiestos
        break;
    default:
        throw new IllegalArgumentException("Mes inválido: " + mes);
}
Versiones modernas: Java 14 introdujo switch expressions con -> que eliminan el fall-through y el break explícito. En Java 8 solo está disponible el switch clásico mostrado aquí.

Siguiente apartado → Iteración: for, for-each y while

Índice de la sección

Índice del curso