La sentencia if permite ejecutar un bloque de instrucciones si se cumple una determinada condición.
El orden de ejecución de una sentencia if es el siguiente:
- Evaluar la condición que es una expresión condicional o booleana (resultando Verdadero o Falso).
- Si el resultado es Verdadero:
- Ejecutar la sentencia o bloque de sentencias incluidas dentro de esta estructura.
- Continuar la ejecución del programa a partir de la siguiente instrucción que se encuentra fuera de la estructura de la sentencia if.
El formato de utilización es el siguiente:
if(expresiónCondicional) {
sentencia1;
sentencia2;
...
sentenciaN;
}
La expresiónCondicional es una expresión cuyo resultado debe ser un valor boolean, es decir, true ó false. Por ejemplo:
- num > 0
- sexo=='H' && edad > 18
El conjunto de sentencias que se encuentran entre las llaves (sentencia1, sentencia2, ..., sentenciaN) es una serie de instrucciones que pueden ser cualquiera de las que pueden ser utilizadas en otro lugar del código fuente (asignar valores a variables, llamar a métodos como mostrar datos u obtener datos del teclado, otras sentencias if, etc). Esas sentencias sólo se ejecutarán en caso de que la expresiónCondicional valga true en el momento en que es evaluada.
Ejemplo:
//Obtener un número por teclado
num = Integer.valueOf(campoDato.getText());
//Comprobar si el número introducido es distinto de cero
if(num != 0) {
//Las siguientes instrucciones sólo se ejecutan
// si el valor de la variable num no es cero
areaMensajes.append("El número introducido no es cero");
resultado = valor / num;
campoResultado = setText(String.valueOf(resultado));
}
//A partir de aquí, las siguientes instrucciones se ejecutan siempre
areaMensajes.append("Fin del programa");
En caso de que el bloque de sentencias que se encuentre dentro de la sentencia if sólo esté formado por una solo sentencia, no es necesaria la utilización de las llaves.
if(expresiónCondicional)
sentenciaSiEsTrue;
Ejemplo:
num = Integer.valueOf(campoDato.getText());
if(num != 0)
areaMensajes.append("El número introducido no es cero");
//A partir de aquí, las siguientes instrucciones se ejecutan siempre
areaMensajes.append("Fin del programa");
También es posible especificar además un bloque de sentencias que debe ejecutarse en el caso contrario, es decir, cuando el resultado de evaluar la expresiónCondicional es false. Para ello debe usarse la estructura if-else, cuyo formato es el siguiente:
if(expresiónCondicional) {
bloqueSentencias1;
} else {
bloqueSentencias2;
}
El bloque de sentencias llamado bloqueSentencias1 sólo se ejecutará si el resultado de evaluar la expresiónCondicional es true, y el bloqueSentencias2 sólo se ejecutará si el resultado de evaluar la expresiónCondicional es false.
Por tanto, el orden de ejecución de una sentencia if-else es el siguiente:
- Evaluar la condición que es una expresión condicional o booleana (resultando Verdadero o Falso).
- Si el resultado es Verdadero:
- Ejecutar el primer bloque de sentencias incluidas dentro de esta estructura.
- Si el resultado es Falso:
- Ejecutar el segundo bloque de sentencias, detrás del else.
- Continuar la ejecución del programa a partir de la siguiente instrucción que se encuentra fuera de la estructura de la sentencia if-else.
Al igual que en la estructura anterior, si alguno de los bloques de sentencias sólo está formado por una instrucción, se puede prescindir de las llaves en ese bloque.
Ejemplo:
//Obtener un número por teclado
num = Integer.valueOf(campoDato.getText());
//Comprobar si el número es positivo o negativo
if(num < 0) {
//Instrucciones que se ejecutan si num < 0
areaMensajes.append("El número introducido es negativo");
} else {
//Instrucciones que se ejecutan si NO se cumple num < 0
areaMensajes.append("El número introducido es positivo");
}
//A partir de aquí, las siguientes instrucciones se ejecutan siempre
areaMensajes.append("Fin del programa");
Dentro de cada bloque de sentencias asociadas al if o al else también pueden aparecer otras estructuras if o if-else. El problema con el que nos podemos encontrar en este tipo de estructuras, es en el momento de anidar varias sentencias if o if-else, pues resulta difícil saber qué else está asociado con qué if, por ello hay que tener en cuenta la siguiente regla: Una sentencia else siempre está asociada con el if precedente más próximo, siempre que no tenga ya asociada otra sentencia else.
Ejemplos de if-else anidados:
//EJEMPLO 1
if (a > b)
System.out.println(a);
if (c > a)
System.out.println(c);
else //Corresponde a if(c>a)
System.out.println(b);
//EJEMPLO 2
if (a > b) {
System.out.println(a);
if (c > a)
System.out.println(c);
} else //Corresponde a if(a>b)
System.out.println(b);
//Este mismo ejemplo 2 queda mucho más claro si se usa adecuadamente el sangrado:
if (a > b) {
System.out.println(a);
if (c > a)
System.out.println(c);
} else //Corresponde a if(a>b)
System.out.println(b);
En estos ejemplos hay que observar que las estructuras son prácticamente idénticas, pero el bloque asociado al else se ejecuta en distintas situaciones en cada caso, como se puede observar en los comentarios.