Tema 7 • Ejercicios

Ejercicio 1: Bloque Try - Catch - Finally

Enunciado

Dado el siguiente código base:

System.out.println("COMIENZO PROGRAMA DIVISIÓN");
int dividendo = 5;
int divisor = 0;
System.out.println("Resultado: " + dividendo / divisor);
System.out.println("FIN PROGRAMA DIVISIÓN");

Se nos pide realizar una serie de tareas y responder a varias preguntas sobre el flujo de las excepciones:

  1. Reproducir el programa en el ordenador y explicar qué ocurre.
  2. Introducir un bloque try - catch - finally. Dentro del catch imprimir "Imposible dividir por 0".
  3. Depurar el programa e indicar el flujo con y sin excepción.
  4. Mostrar el mensaje de ex.
  5. Mostrar la traza del error.
  6. Pedir dividendo y divisor al usuario, ¿dónde se cerraría el flujo?
  7. ¿Qué pasa si el usuario introduce letras en vez de números?
  8. ¿La excepción resultante deberíamos prevenirla o gestionarla?
  9. Describir el comportamiento si se añade un catch(Exception).
  10. ¿Es posible capturar excepciones de tipo Throwable?

Solución

Aplicando el bloque try-catch-finally para evitar que el programa colapse al dividir por cero, el código quedaría así:

package Tema7.Ejercicios.ejercicio1;

public class Ejercicio1 {
    public static void main(String[] args) {
        System.out.println("COMIENZO PROGRAMA DIVISIÓN");
        try {
            int dividendo = 5;
            int divisor= 0;
            System.out.println("Resultado: " + dividendo / divisor);
        } catch (ArithmeticException ex) {
            System.out.println("Imposible dividir por 0");
        } finally {
            System.out.println("FIN PROGRAMA DIVISIÓN");
        }
    }
}

Respuestas a las cuestiones teóricas

Traza del error (Preguntas 4 y 5)

Si quisiéramos mostrar el mensaje del error o la traza completa por consola, utilizaríamos los métodos de la excepción dentro del bloque catch:

System.out.println(ex.getMessage()); // Muestra el mensaje
ex.printStackTrace();                // Muestra la traza del error

Entrada de datos y cierre de recursos (Pregunta 6)

Si pedimos los datos al usuario usando la clase Scanner, deberíamos cerrar el flujo (scanner.close()) dentro del bloque finally. Esto nos garantiza que el recurso se libere siempre, ocurra o no ocurra un error durante la división.

Tipos de datos incorrectos (Pregunta 7)

¿Qué pasa si el usuario introduce letras en vez de números? Como nuestro código actual solo tiene una excepción preparada para la división matemática (ArithmeticException), el programa lanzaría una InputMismatchException. Al no estar capturada, el programa se detendría bruscamente.

¿Prevenir o gestionar? (Pregunta 8)

En el caso concreto de la división por cero, deberíamos prevenirla en lugar de usar un bloque try-catch. Sería mucho más eficiente usar un simple condicional if antes de operar:

if (divisor != 0) {
    System.out.println("Resultado: " + dividendo / divisor);
} else {
    System.out.println("Imposible dividir por 0");
}