El condicional switch de Java

curso Java

En este décimo capítulo del curso, te voy a explicar con ejemplos prácticos como funciona el condicional switch en Java.

¿Qué es switch en Java?

«switch» es una estructura condicional como if else, con la gran diferencia, de que en este, solo tenemos una expresión de comparación. En torno a esta, se evaluarán una serie de selectores de código.

Sintaxis del condicional switch de Java

Comencemos por la sintaxis del condicional switch de Java.

El siguiente pseudocódigo muestra una expresión en la parte de declaración del switch. Después, tendremos una serie de «case» con un valor asociado.

switch (expresión) {
	case valor1:
		// instrucciones de código
		break;   
	case valor2:
		// instrucciones de código
		break;

    ...
  
	case valor_n:
		// instrucciones de código
		break;
  	default:
		// instrucciones de código
}

Funcionamiento del condicional switch de Java

Veamos esto con un ejemplo práctico con el condicional switch de Java, el cual, te hará entender el funcionamiento de esto.

Partimos de un valor (200) almacenado en la variable «error».

Después, empieza la declaración del condicional switch en la línea 7. Esta declaración, no necesita de una expresión comparativa realmente. Le paso el valor de error (200) y a partir de este, buscará una coincidencia en cada uno de los «case».

En este caso, el «case 200», es el que coincide con el valor pasado, por lo tanto, se ejecuta su bloque de código. El resto se ignora.

public class Main {
    public static void main(String[] args) {
        //variables del programa
        int error = 200;

        //condicional switch
        switch (error) {
            case 200:
                System.out.println("Todo ok.");
                break;
            case 301:
                System.out.println("Movimiento permanente de la página.");
                break;
            case 302:
                System.out.println("Movimiento temporal de la página.");
                break;
            case 404:
                System.out.println("Página no encontrada.");
                break;
            case 500:
                System.out.println("Error interno del servidor.");
                break;
            case 503:
                System.out.println("Servicio no disponible.");
                break;
            default:
                System.out.println("Código de error no disponible.");
        }
    }
}

Para evaluar, se admiten diferentes tipos de datos, pero no en el mismo switch. Es decir, por ejemplo, en el siguiente código, tenemos una variable de tipo short. Todos los «case» son válidos para un contenedor de este tipo, sin embargo, el case con valor 301000, no es válido para un tipo short y por lo tanto, no puede funcionar.

public class Main {
    public static void main(String[] args) {
        //variables del programa
        short error = 200;

        //condicional switch
        switch (error) {
            case 200:
                System.out.println("Todo ok.");
                break;
            case 301000:
                System.out.println("Movimiento permanente de la página.");
                break;
            case 302:
                System.out.println("Movimiento temporal de la página.");
                break;
            case 404:
                System.out.println("Página no encontrada.");
                break;
            case 500:
                System.out.println("Error interno del servidor.");
                break;
            case 503:
                System.out.println("Servicio no disponible.");
                break;
            default:
                System.out.println("Código de error no disponible.");
        }
    }
}

Error en la consola

incompatible types: possible lossy conversion from int to short

El mensaje principal de error, es «incompatible types», tipos incompatibles.

El uso de break en el condicional switch

Por si no te has fijado, en realidad, todo el conjunto de switch, es un único bloque, fíjate que a diferencia de if else, que cada cosa tenía sus propias llaves, en switch, esto no pasa.

Es por este motivo, que para poder funcionar correctamente, requiere del uso de una nueva palabra reservada del lenguaje. «break».

Si no ponemos esta palabra al terminar cada «case», lo que va a ocurrir, es que se ejecutará todo en bloque, independientemente de si se cumple un «case», o no. Aquí puedes ver lo que ocurriría sin utilizar «break».

public class Main {
    public static void main(String[] args) {
        //variables del programa
        int error = 200;

        //condicional switch
        switch (error) {
            case 200:
                System.out.println("Todo ok.");
            case 301:
                System.out.println("Movimiento permanente de la página.");
            case 302:
                System.out.println("Movimiento temporal de la página.");
            case 404:
                System.out.println("Página no encontrada.");
            case 500:
                System.out.println("Error interno del servidor.");
            case 503:
                System.out.println("Servicio no disponible.");
            default:
                System.out.println("Código de error no disponible.");
        }
    }
}

El resultado es la ejecución de todas las instrucciones como si estuvieran fuera de un switch. Por lo que sin break, no podemos utilizar switch.

Resultado en la consola

Todo ok.
Movimiento permanente de la página.
Movimiento temporal de la página.
Página no encontrada.
Error interno del servidor.
Servicio no disponible.
Código de error no disponible.

Volvamos a dejar el código como estaba al principio. ¿Y si tenemos este valor en la variable?

int error = 500;

En este caso, evalúa el «case 200», este no coincide con el valor 500. Ignora todo este código. Evalúa el siguiente case (301). Este valor tampoco concuerda.

Pues bien, se van evaluando e ignorando todos los selectores hasta llegar a una coincidencia. Esta se ejecuta y finalmente, se ignoran el resto de líneas gracias al break.

Resultado en la consola

Error interno del servidor.

El uso de default en el condicional switch

Nos queda ver un apartado más, «default». Esta sección del switch, solo se va a ejecutar en caso de que no haya ninguna coincidencia con los «case».

int error = 700;

Resultado en la consola

Código de error no disponible.

Si te preguntas porque no lleva break, es porque este es el último apartado, al no haber nada después, no hace falta salir del bloque switch, ya que al terminar con la última instrucción, sale solo.

Por cierto, lo puedes poner, pero es totalmente innecesario.

default:
	System.out.println("Código de error no disponible.");
    break;

Error por case duplicado

Si pones un case o varios duplicados como en este código, te dará un error.

switch (error) {
	case 200:
    	System.out.println("Todo ok.");
    	break;
    case 200:
    	System.out.println("Todo ok.");
        break;
}

Error en la consola

java: duplicate case label

El error indica que hay una etiqueta case duplicada.

Dejar un switch sin etiqueta default

¿Ocurre algo por dejar sin poner la etiqueta «default»?

public class Main {
    public static void main(String[] args) {
        //variables del programa
        int error = 700;

        //condicional switch
        switch (error) {
            case 200:
                System.out.println("Todo ok.");
                break;
            case 301:
                System.out.println("Movimiento permanente de la página.");
                break;
            case 302:
                System.out.println("Movimiento temporal de la página.");
                break;
            case 404:
                System.out.println("Página no encontrada.");
                break;
            case 500:
                System.out.println("Error interno del servidor.");
                break;
            case 503:
                System.out.println("Servicio no disponible.");
                break;
        }
    }
}

La respuesta es que no, pero en caso de que no haya coincidencias con los «case», no se ejecutará nada del switch.

Diagrama de flujo switch de Java

Te dejo por aquí un diagrama de flujo de switch para que veas quizás de forma más sencilla, cuales son los posibles caminos que puede tomar este condicional.

switch vs if else en Java

Todavía nos quedan muchas cosas que ver y hacer con switch. Con el fin de no daros demasiada información de golpe del mismo tema y seguir avanzando rápido con nuevos, dejo el capítulo aquí con una pequeña comparativa entre switch e if else.

Código switch:

public class Main {
    public static void main(String[] args) {
        //variables del programa
        int error = 200;

        //condicional switch
        switch (error) {
            case 200:
                System.out.println("Todo ok.");
            case 301:
                System.out.println("Movimiento permanente de la página.");
            case 302:
                System.out.println("Movimiento temporal de la página.");
            case 404:
                System.out.println("Página no encontrada.");
            case 500:
                System.out.println("Error interno del servidor.");
            case 503:
                System.out.println("Servicio no disponible.");
            default:
                System.out.println("Código de error no disponible.");
        }
    }
}

Código if else:

    public static void main(String[] args) {
        //variables del programa
        int error = 200;

        //condicional if
        if (error == 200) {
            System.out.println("Todo ok.");
        } else if (error == 301) {
            System.out.println("Movimiento permanente de la página.");
        } else if (error == 302) {
            System.out.println("Movimiento temporal de la página.");
        } else if (error == 404) {
                System.out.println("Página no encontrada.");
        } else if (error == 500) {
            System.out.println("Error interno del servidor.");
        } else if (error == 503) {
           System.out.println("Servicio no disponible.");
        } else {
            System.out.println("Código de error no disponible.");
        }
    }
}

Como puedes ver, no hay mucha diferencia de líneas de código escritas, pero la gran diferencia, es que en el condicional if, tenemos que poner cada vez una expresión como (error == valor), en el switch, en cada case, hacemos esta comparación, pero no la tenemos que escribir.

El bloque if, es el equivalente al primer case del switch. Los else if, lo son al resto de case. Finalmente, el equivalente a else, es default en el switch.

¿Cuándo utilizar switch y cuando if else?

La respuesta es fácil, cuando tengas que realizar muchas comparativas repetitivas como la de este capítulo (valor == valor), utiliza switch. En cambio, si tienes pocas cosas a comparar o son más complejas, usa if else.

Todo el temario del curso Java aquí.

Ejercicios de Java

Te dejo unos ejercicios relacionados con el temario. Las soluciones, las encontrarás en el siguiente capítulo.

  1. Encuentra los errores en este condicional switch y corrígelos.
public class Main {
    public static void main(String[] args) {
        //variables del programa
        byte error = 200;

        //condicional switch
        switch error {
            case 200
                System.out.println("Todo ok.");
            case 301
                System.out.println("Movimiento permanente de la página.");
            case 302
                System.out.println("Movimiento temporal de la página.");
            case 404
                System.out.println("Página no encontrada.");
            case 500
                System.out.println("Error interno del servidor.")
            case 503
                System.out.println("Servicio no disponible.");
            default
                System.out.println("Código de error no disponible.");
        }
    }
}
  1. Escribe un condicional switch para evaluar los días de la semana mediante una variable o constante numérica (lunes, podría ser 1, martes 2…). Cada día, tendrá su propio case. En cada case, basta con que pongas un print(). Además, quiero que pongas un print() alternativo en el caso de que el valor de la variable con el día de la semana, no sea un valor del 1 al 7.

Soluciones de los ejercicios del capítulo anterior

  1. En este condicional if, faltaba el bloque obligatorio if. La expresión que hayas utilizo en dicho bloque, no es relevante para la solución. Con que ejecute y funcione como se espera, ya has superado el ejercicio.
public class Main {
    public static void main(String[] args) {
        //variables del programa
        int numero1 = 10;
        int numero2 = 15;
        int numero3 = 10;

        //condicional if
        if (numero1 > numero2) {
            System.out.println("Se ejecuta el if.");
        } else if (numero2 < numero3) {
            System.out.println("Se ejecuta el primer else if.");
        } else if (numero1 > 50) {
            System.out.println("Se ejecuta el segundo else if.");
        } else if (numero2 == 15) {
            System.out.println("Se ejecuta el tercer else if.");
        } else {
            System.out.println("Se ejecuta el else.");
        }
    }
}
  1. Aquí basta con poner solo el bloque if con esta expresión. No se pedía más.
public class Main {
    public static void main(String[] args) {
        //variables del programa
        int numero1 = 10;
        int numero2 = 15;

        //condicional if
        if (numero1 != numero2) {
            System.out.println("Se ejecuta el if.");
        }
    }
}
  1. En este ejercicio, solo tenías que responder. La respuesta correcta es que se va a ejecutar el bloque if, ya que es la primera expresión «true». El resto de bloques son ignorados.
El condicional switch de Java

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll hacia arriba