Propagación
La propagación de excepciones en Java es el proceso en el que una excepción lanzada en un método puede ser "pasada" a métodos superiores en la pila de llamadas (call stack) si no se captura en el método donde fue lanzada. Este proceso puede continuar hasta que la excepción se capture en algún punto o llegue al método main(), provocando la finalización del programa si no se captura.
La propagación de funciones funciona de la siguiente manera:
- Lanzamiento de la excepción (
throw): Si ocurre un error dentro de un método, ese método puede lanzar una excepción para señalar que algo fue incorrecto. - Propagación de la excepción: Si la excepción no se captura en el mismo método donde se lanzó, Java propaga la excepción al método llamador (el método que llamó al primer método).
- Captura de la excepción (
try-catch): El método llamador puede capturar la excepción con el bloquecatch. Si no captura la excepción, la propagación continúa al próximo nivel superior en la pila de llamadas.
En este primer ejemplo, hay tres llamadas a funciones y la excepción se atiende en el método metodoQueLlamaDividir:
public class EjemploPropagacion {
// Método que lanza la excepción
public static void dividir(int numerador, int denominador) throws ArithmeticException {
if (denominador == 0) {
throw new ArithmeticException("No se puede dividir por cero.");
}
System.out.println("Resultado: " + numerador / denominador);
}
// Método que llama al anterior y captura la excepción
public static void metodoQueLlamaDividir() {
try {
dividir(10, 0);
} catch (ArithmeticException e) {
System.out.println("Error capturado en main: " + e.getMessage()); // Captura la excepción aquí
}
}
public static void main(String[] args) {
metodoQueLlamaDividir(); // Llama al método que lanza la excepción
}
}
En este segundo ejemplo, también tenemos tres métodos, pero propagamos la excepción a un método más alto en la pila, como si fuera una "cascada" de errores.
public class EjemploPropagacion {
// Método que lanza la excepción
public static void dividir(int numerador, int denominador) throws ArithmeticException {
if (denominador == 0) {
throw new ArithmeticException("No se puede dividir por cero.");
}
System.out.println("Resultado: " + numerador / denominador);
}
// Método que llama a dividir y propaga la excepción
public static void metodoQueLlamaDividir() throws ArithmeticException {
dividir(10, 0); // Lanza la excepción
}
// Método principal que captura la excepción
public static void main(String[] args) {
try {
metodoQueLlamaDividir(); // Llama al método que lanza la excepción
} catch (ArithmeticException e) {
System.out.println("Error capturado en main: " + e.getMessage()); // Captura la excepción en main
}
}
}