El if no tiene misterio. Los errores que de verdad se cometen con él son otros tres: quitar las llaves, colar un punto y coma, y comparar cadenas con ==.
También te puede interesar
La forma básica
if (condición) {
// se ejecuta si la condición es verdadera
}La condición tiene que ser un boolean. En C se puede poner un número y se considera cierto si no es cero; en Java eso no compila, lo cual evita de paso el clásico if (x = 1) escrito con un solo igual.
int nota = 7;
if (nota >= 5) {
System.out.println("aprobado");
}salidaaprobado
if, else if, else
if (nota >= 9) System.out.println("sobresaliente");
else if (nota >= 7) System.out.println("notable");
else if (nota >= 5) System.out.println("aprobado");
else System.out.println("suspenso");salidanotable
Se evalúan en orden y se para en la primera que se cumple. Por eso el orden importa: si pusieras nota >= 5 la primera, un nueve también entraría por ahí y nunca verías «sobresaliente».
Tres maneras de pegarse un tiro en el pie
1. Quitar las llaves
Con una sola sentencia las llaves son opcionales. El problema llega cuando alguien añade una segunda línea meses después:
if (hayError)
registra("algo falló");
detener(); // esto se ejecuta SIEMPRE, no forma parte del ifLa sangría engaña; al compilador le da igual. Ponerlas siempre cuesta dos caracteres.
2. El punto y coma
int i = 1;
if (i > 100);
System.out.println("esto se imprime siempre");javac -Xlint:allPuntoYComa.java:4: warning: [empty] empty statement after if
if (i > 100);
^
1 warningsalidaesto se imprime siempre
El if se queda con el punto y coma como cuerpo —una sentencia vacía— y la línea de abajo ya no depende de él. Compila: solo es un aviso, y solo si pides -Xlint. Es el fallo más difícil de ver de los tres.
3. Comparar cadenas con ==
String texto = "hola";
String otro = new String("hola");
System.out.println("con == : " + (texto == otro));
System.out.println("con equals(): " + texto.equals(otro));salidacon == : false con equals(): true
Con objetos, == pregunta «¿son el mismo objeto?», no «¿valen lo mismo?». Para comparar cadenas, siempre equals. Y un truco que evita un NullPointerException: poner la constante delante.
String nulo = null;
System.out.println("hola".equals(nulo)); // false, no revienta
// nulo.equals("hola") // esto sí: NullPointerExceptionsalidafalse
Dos cosas que ya no hace falta escribir a mano
Object valor = 42;
if (valor instanceof Integer n && n > 10) {
System.out.println("es un Integer mayor que 10: " + n);
}salidaes un Integer mayor que 10: 42
instanceof con patrón comprueba el tipo y declara la variable ya convertida: te ahorra el cast de la línea siguiente, que era donde se colaban los errores.
String dia = "sábado";
String tipo = switch (dia) {
case "sábado", "domingo" -> "fin de semana";
default -> "laborable";
};
System.out.println(dia + " es " + tipo);salidasábado es fin de semana
Cuando la cadena de else if compara siempre la misma variable contra valores fijos, un switch con flecha se lee mejor, no se puede olvidar un break y, usado como expresión, el compilador te obliga a cubrir todos los casos.
Más información en inglés: The if statement in Java.
Todo el código se compiló y se ejecutó con Java 25 LTS en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.