W3docs

Java if, else y else if

Ramifique el flujo de un programa en Java con las sentencias if, else if y else, y aprenda a anidar condiciones con limpieza.

Un programa que siempre ejecuta la misma secuencia de instrucciones no es muy útil. if es la forma en que Java hace una pregunta y elige qué hacer a continuación. Junto con else if y else, forma la columna vertebral de cada decisión que su código tomará jamás.

El if básico

if (condition) {
  // runs only when condition is true
}

La condición debe ser una expresión boolean — no hay valores truthy/falsy como en JavaScript o Python. if (1) no compila; if (count > 0) sí.

int age = 20;

if (age >= 18) {
  System.out.println("You can vote.");
}

Añadir un else

else proporciona la rama alternativa — lo que se ejecuta cuando la condición es false:

int age = 16;

if (age >= 18) {
  System.out.println("You can vote.");
} else {
  System.out.println("Too young to vote.");
}

Se ejecuta exactamente una de las dos ramas. No hay caída en cascada.

Encadenar con else if

Para más de dos resultados, encadene else if. Java comprueba cada condición de arriba abajo y ejecuta la primera rama cuya condición sea verdadera; el resto se omite:

int score = 72;

if (score >= 90) {
  System.out.println("A");
} else if (score >= 80) {
  System.out.println("B");
} else if (score >= 70) {
  System.out.println("C");
} else {
  System.out.println("F");
}

El orden importa. Si pone la condición más laxa primero, se traga todos los casos posteriores. El ejemplo de arriba imprime C porque score >= 70 es la primera coincidencia — aunque score >= 60 también sería verdadera si se comprobara.

Las llaves son opcionales — pero úselas

Java le permite omitir las llaves cuando una rama es una sola instrucción:

if (loggedIn)
  showDashboard();
else
  showLogin();

No lo haga. Use siempre llaves. Las dos líneas de abajo lucen iguales pero se comportan distinto:

if (loggedIn)
  showDashboard();
  logActivity();        // ALWAYS runs — not part of the if!

if (loggedIn) {
  showDashboard();
  logActivity();        // both inside the if
}

El coste de {} son dos caracteres; el coste del error es su fin de semana.

Expresiones booleanas dentro de if

La condición puede ser cualquier cosa que se evalúe a boolean:

if (x > 0 && x < 100) { ... }
if (name.equals("admin")) { ... }
if (!list.isEmpty()) { ... }
if (user != null && user.isActive()) { ... }

Ese último patrón — comprobación de null primero, luego una llamada a método — usa evaluación de cortocircuito. Si user es null, user.isActive() nunca se invoca. Vea Operadores lógicos.

Anidar sentencias if

Puede poner un if dentro de otro if. A veces es la forma más clara de expresar una condición:

if (user != null) {
  if (user.isAdmin()) {
    System.out.println("Welcome, admin.");
  } else {
    System.out.println("Welcome, user.");
  }
} else {
  System.out.println("Please log in.");
}

Pero la anidación profunda se lee mal. Los retornos tempranos suelen limpiarla:

if (user == null) {
  System.out.println("Please log in.");
  return;
}
if (user.isAdmin()) {
  System.out.println("Welcome, admin.");
  return;
}
System.out.println("Welcome, user.");

Menos indentación, más fácil de seguir.

Error común: = en lugar de ==

Los principiantes que vienen de otros lenguajes a veces escriben:

if (x = 5) { ... }   // compile error

= es asignación, == es comparación. A diferencia de C, Java lo rechaza en tiempo de compilación a menos que la variable sea un boolean — porque el resultado de int x = 5 es un int, no un boolean. Esa es una pequeña merced que el sistema de tipos de Java le da gratis.

Un ejemplo resuelto

java— editable, runs on the server

Qué sigue

Para asignaciones condicionales de una línea, el operador ternario suele ser más legible que un if/else completo.

Practice

Práctica

What is printed by this code when score is 85?