If-else en Java: cómo utilizarlo, ejemplos y trampas - JavAutodidacta

if-else en Java: cómo utilizarlo, ejemplos y trampas

¿Sabes cómo funciona la estructura if-else en Java? En este artículo te voy a explicar el funcionamiento básico del if-else. Además, te voy a aclarar los detalles que has de conocer para no caer en las trampas del examen de certificación de Oracle. Si no lo has hecho aún, te aconsejo que le eches un vistazo a la entrada que publiqué sobre las condiciones booleanas, ya que if-else hace uso de ellas.

¿Qué es, y cómo funciona una estructura if-else en Java?

Estructura if-else en Java

Está lloviendo: TRUE; Quiero ir a la playa: TRUE x 2

La estructura if-else se utiliza en Java para tomar decisiones sobre un valor preexistente. Es decir, si una condición basada en ese valor preexistente se cumple (si esa condición es verdadera), el programa tomará un camino. Si no (si esa condición es falsa), el programa tomará otro. A esa condición se la llama condición booleana, ya que un valor booleano (boolean) es aquel que solo puede tomar como valor true (verdadero) o false (falso).

Por ejemplo: si está lloviendo iré en metro al trabajo; si no, iré andando.

(Por cierto: me pregunto si los rascacielos de la foto sobresalen sobre las nubes. ¡Allí arriba siempre hace buen día!)

Si necesitas más información sobre qué es un constructor o cómo instanciar un objeto en Java, te recomiendo que leas los artículos que he publicado sobre dichos temas:

Estructura if-else: partes componentes

La estructura if-else en Java está compuesta de dos partes: la parte if, donde se evalúa la condición, y la parte else, donde se especifica qué hacer si no se cumple esa condición.

If es el término inglés que equivale al si condicional español; else significa en el resto de casos. Así, una estructura if-else en Java viene a decir si se cumple la condición especificada, haz lo siguiente. En el resto de casos, haz esto otro.

Estas dos partes no tienen el mismo valor, en el sentido de que solo la parte if es imprescindible; la parte else puede aparecer o no, y no puede aparecer aislada:

Una estructura if-else en Java tampoco puede contener más de un bloque else:

Si necesitas evaluar más de una condición, puedes hacerlo de dos maneras:

  • Encadenar una serie de condiciones en el if, utilizando los operadores &&, &, || y |. Puedes encontrar ejemplos sobre cómo utilizar estos operadores en el artículo dedicado a las condiciones booleanas del que te hablé más arriba.
  • Encadenar un serie de estructuras if-else. En este caso, la traducción de dicha estructura a lenguaje normal sería:

Si (está lloviendo) {iré en metro al trabajo;} en otro caso, si (no), {iré andando si no hace frío}, en el resto de casos {corriendo si lo hace}. En Java:

Si el valor a evaluar es un número entero, una String, o una enumeración (enum), puedes utilizar un switch. Consulta esta entrada parte aprender a utilizar un switch.

En resumidas cuentas


  • Un if-else está compuesto de una parte que evalúa una condición (if) y de otra parte (else) que decide qué hacer en el resto de casos. Solo la parte if es imprescindible.
  • Solo puede aparecer un bloque else por cada if.
  • Puedes evaluar varias condiciones encadenando varias condiciones en un if, o construyendo una cadena de if-else if-else... En ese caso, quizá sea mejor que utilices un switch.

Qué hay que tener en cuenta para el examen

Como ya te he comentado en muchas otras ocasiones, el examen de certificación de Java está repleto de trampas, de manera que a menudo parece que la pregunta está evaluando tu conocimiento sobre un tema (las lambdas, por ejemplo), cuando en realidad el código no compila porque han omitido un punto y coma al final de una línea.

El examen consiste en preguntas con respuestas tipo test (a veces has de escoger una respuesta correcta; en ocasiones, varias). Si una de las opciones es "el código no compila", asegúrate de analizar todas las líneas una a una, y de asegurarte que la sintaxis es correcta.

if(false) con código inalcanzable

Imagínate, por ejemplo, que, en el caso de que una de las opciones sea "el código no compila", y que te muestren lo siguiente:

Tú sabes que el compilador no sabe el valor de las variables (a no ser que estas estén marcadas con la palabra clave final), así que un if que evalúe una variable booleana inicializada como false no representa ningún problema para el compilador, ¿pero y si utilizas false directamente? 

Es posible que entonces pienses que, realmente, el código no compila, porque el código que no se llega a ejecutar provoca un error de compilación (unreachable code). Por cierto, tengo un par de artículos sobre qué hacer cuando tu código no compila, y te aconsejo que los revises.

En este caso, te equivocas: es cierto que el código dentro del bloque if no se ejecuta cuando se utiliza la palabra clave false, pero el compilador no pone ningún problema, ya que if(false) se puede utilizar con el fin de depurar código.

If-else en Java sin llaves

Como otras muchas estructuras en Java, puedes utilizar un if-else sin llaves. No obstante, para que el código compile, solo puede aparecer una línea de código dentro de cada bloque:

Como ves, hay un error de un 'else' sin 'if'. Esto se debe a que, al no existir llaves, el compilador considera que solo la primera línea de código, System.out.println("Está lloviendo"); está dentro del bloque if. A continuación, sale del bloque if y se encuentra con la línea de código System.out.println("Voy en metro");, y solo entonces encuentra el else, descolgado de su if. Como ya sabes, no puede haber un else separado de un if; así que el compilador se detiene con un error.

Pero, ¿y si colocas las dos líneas de código dentro de una misma línea de texto?

El resultado, como ves, es el mismo. Un bloque if, o else, puede contener una sola línea de código. Y por "línea de código" se entiende "cualquier cosa, hasta el primer punto y coma".

Da igual que estén en la misma línea de texto. El compilador no tiene en cuenta espacios, saltos de línea o tabulados. Todas esas separaciones visuales, que hacen el código más claro, no marcan ninguna diferencia para el compilador.

Bloque else confuso (dangling else)

¿Cuál es el resultado de ejecutar el siguiente código?

Como te acabo de explicar, al compilador le da igual cómo tabules el código; los espacios no tienen valor en Java. Es por eso que no debes dejarte engañar con la tabulación: un bloque else pertenece al if que tenga más cercano. Da igual cómo esté tabulado el código.

Este caso concreto de código ambiguo es tan importante que tiene hasta una entrada en la Wikipedia. La mejor manera de resolverlo es utilizar siempre llaves en tu código. Que sea legal no utilizarlas no quiere decir que tú tengas que prescindir de ellas. También es legal colocar todo tu código en una única línea de texto, pero por favor, ¡no lo hagas!

Estructura equivalente: el operador ternario

Como ya te he dicho antes, puedes utilizar un switch si ves que en tu código tienes una cadena muy larga de bloques if-else. El bloque switch le dará claridad a tu código.

Por otro lado, tienes el operador ternario, que es una versión resumida de un bloque if-else. Al contrario que el bloque switch, el operador ternario puede hacer tu código ilegible si no lo usas con precaución.

¿Qué es un operador ternario?

Un operador ternario asigna directamente un valor a una variable (o un objeto a una referencia) según una condición booleana. Tiene la siguiente estructura:

Para que nos entendamos:

int number = ¿qué valor tiene estaLloviendo ? si tiene valor true, 3 : si tiene valor false, 4;

El operador ternario es más críptico que una estructura if-else en Java. Es por ello que hay que utilizarlo con precaución, ya que es fácil convertirlo en algo incomprensible. Cómo no, en el examen es posible que te encuentres algo así:

En serio, jamás, jamás utilices el operador ternario para nada más complejo que el primer ejemplo. Es posible (o eso espero) que solo te encuentres ejemplos tan enrevesados del uso de operadores ternarios en el examen de certificación y en ejercicios para prepararte el examen. 

Ten en cuenta lo siguiente


  • Utiliza un switch si has encadenado varios bloques if-else y si la condición que se evalúa concierne a un número entero, una String o una enumeración (enum).
  • Utiliza el operador ternario para resumir estructuras if-else muy sencillas.

Ejercicios recomendados

¿Has revisado mi lista de recursos para aprender Java por tu cuenta? Si lo has hecho (y si no, ya estás tardando) verás que te recomiendo que te registres (es gratis) en CodingBat y que hagas todos los ejercicios que aparecen. En un buen recurso para aprender a utilizar estructuras básicas de Java. Además, como no podía ser de otra manera, contiene varios ejercicios de if-else.

El ejercicio recomendado es que hagas todos los ejercicios de CodingBat (puedes empezar por los de if-else, si te apetece). A continuación, inventa tú mismo más variantes de ejercicios para seguir practicando.

¡Cuéntame en los comentarios si has encontrado alguna dificultad!