Tema 7 • Ejercicios

Ejercicio 5: Creación de Excepciones Personalizadas

Enunciado

Partiendo del ejercicio anterior (introducción de números en una lista), vamos a profesionalizar el manejo de errores creando nuestra propia excepción.

Pasos a seguir:

  1. Crear una clase llamada NumeroRepetido que herede de IllegalArgumentException.
  2. Crear un constructor con parámetros que reutilice el código del padre (super).
  3. Modificar la lógica para lanzar esta nueva excepción en lugar de la genérica cuando un número ya exista en la lista.

Solución

Para resolver este ejercicio, dividiremos el código en dos ficheros: la definición de nuestra excepción y la lógica del programa principal.

1. Definición de la Excepción Personalizada

Al heredar de IllegalArgumentException, nuestra excepción será de tipo Unchecked. Reutilizamos el constructor del padre para poder pasarle un mensaje descriptivo.

package Tema7.Ejercicios.ejercicio5;

// Paso 1 y 2: Heredar de la clase adecuada y crear el constructor
public class NumeroRepetido extends IllegalArgumentException {
    public NumeroRepetido(String mensaje) {
        super(mensaje);
    }
}

2. Implementación en el Programa Principal

En esta clase, lanzamos NumeroRepetido cuando detectamos el duplicado y la capturamos específicamente en el main.

package Tema7.Ejercicios.ejercicio5;

import java.util.Scanner;

public class Ejercicio5 {
    public static void main(String[] args) {
        try {
            agregarNumeros();
        } catch (NumeroRepetido e) {
            // Imprimimos la traza y el mensaje personalizado
            e.printStackTrace();
            System.out.println(e.getMessage());
        } finally {
            // Este bloque se ejecuta siempre
            System.out.println("Bloque finally ejecutado: Limpieza de recursos...");
        }
        System.out.println("Fin de la ejecución del programa.");
    }

    private static void agregarNumeros() {
        int[] lista = {0, 12, 20, 13, 40};

        Scanner scanner = new Scanner(System.in);
        System.out.print("Introduce un número: ");
        int numero = scanner.nextInt();

        // Paso 3: Lanzar nuestra excepción personalizada
        if (estaEnLista(lista, numero)) {
            throw new NumeroRepetido("Error: El número " + numero + " ya está en la lista.");
        }

        System.out.println("El número no estaba repetido. Lista actual:");
        for (int e : lista) {
            System.out.println(e);
        }
        
        scanner.close();
    }

    private static boolean estaEnLista(int[] lista, int numero) {
        for (int e : lista) {
            if (e == numero) return true;
        }
        return false;
    }
}

Nota sobre el bloque finally

Como se observa en el código, el bloque finally nos asegura que ciertas instrucciones (como cerrar conexiones o mostrar mensajes de cierre) se ejecuten independientemente de si el número estaba repetido o no.