"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué desaparece la excepción `MyExc2` en este ejemplo de manejo de excepciones de Java?

¿Por qué desaparece la excepción `MyExc2` en este ejemplo de manejo de excepciones de Java?

Publicado el 2024-11-04
Navegar:918

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

Manejo de excepciones en las cláusulas Catch y Finalmente

Cuando se trata del manejo de excepciones en Java, es crucial comprender la interacción entre las cláusulas catch y finalmente . Considere el siguiente ejemplo proporcionado para una tarea universitaria:

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}

La pregunta solicitaba el resultado de este código. Si bien algunos pueden haber respondido "13Excepción en el hilo principal MyExc2", la respuesta correcta es "132Excepción en el hilo principal MyExc1".

Por qué desaparece MyExc2

La clave para entender el resultado correcto radica en el comportamiento de las cláusulas catch y finalmente. Cuando se produce una excepción dentro de un bloque catch o finalmente, tiene implicaciones importantes en el flujo. Aquí hay un desglose:

  • Excepción en el bloque catch: Si se lanza una nueva excepción en un bloque catch (como se ve con throw new MyExc2() arriba), la excepción original es "abortado." La ruta de ejecución actual queda incompleta y la nueva excepción asume el control como la que se propaga hacia afuera.
  • Excepción en el bloque finalmente: De manera similar, si se lanza una nueva excepción un bloque finalmente, la excepción original también se cancela. Sin embargo, hay un punto crucial a tener en cuenta:

    • Bloque finalmente del bloque catch: Si la nueva excepción se lanza en el bloque finalmente de un bloque catch, aún estará sujeta a las finalmente bloquear, si corresponde.

Seguimiento del Excepciones

Al rastrear la ejecución según estos principios, podemos ver que:

  1. El bloque try en main imprime "1" y llama a q().
  2. Dentro de q(), el bloque try arroja un MyExc1.
  3. El bloque catch en q() maneja la excepción silenciosamente.
  4. El bloque finalmente en q() imprime "3" y arroja una excepción.
  5. Catch bloque en principal:

    • MyExc2 se lanza en este bloque, abortando el MyExc1 original.
    • Sin embargo, el bloque catch tiene un bloque finalmente que aún se ejecuta.
  6. Finalmente bloque en principal:

    • El MyExc1 se lanza en este bloque, abortando el MyExc2.

Por lo tanto, la salida correcta es "132Exception en el hilo principal MyExc1". La excepción MyExc2 se "olvida" porque se lanza una nueva excepción (MyExc1) en el bloque finalmente del bloque catch que manejaba MyExc2.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3