"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é el código de manejo de excepciones de Java produce \"132Exception en el hilo principal MyExc1\" en lugar de \"13Exception en el hilo principal MyExc2\"?

¿Por qué el código de manejo de excepciones de Java produce \"132Exception en el hilo principal MyExc1\" en lugar de \"13Exception en el hilo principal MyExc2\"?

Publicado el 2024-11-06
Navegar:631

Why does the Java exception handling code produce \

Manejo de excepciones en Java: desentrañando la ambigüedad

En un desconcertante escenario de manejo de excepciones de Java, una pregunta universitaria presentó el siguiente fragmento de código:

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

// Main Class
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 solicitó su resultado y la respuesta proporcionada fue "13Exception en el hilo principal MyExc2". Sin embargo, la respuesta correcta es "132Excepción en el hilo principal MyExc1".

Aclarando la ambigüedad

Para descifrar este acertijo, es esencial comprender la precedencia de las excepciones:

  • Principio: Cuando se lanza una nueva excepción dentro de un catch o finalmente se bloquea, se cancela la excepción actual que se está manejando.
  • Consecuencias :

    • La propagación de la excepción actual se detiene.
    • La nueva excepción se convierte en la excepción que se propaga.
    • La nueva excepción desenrolla la pila normalmente, encontrar cualquier captura aplicable o bloqueos finales.

Volviendo sobre la ejecución

Aplicando este principio al código:

  1. Ejecución inicial:

    • Línea 13: MyExc1 se lanza en el bloque try de q().
    • Línea 18: El MyExc1 está atrapado en el bloque catch de q().
    • Línea 21: se ejecuta la línea 21 (imprime 3).
  2. Bloque Catch Excepción:

    • Línea 19: MyExc2 se lanza en el bloque catch de main().
    • Línea 22: MyExc2 aborta la propagación de MyExc1.
    • Línea 19: MyExc2 comienza a desenrollarse la pila.
  3. La ejecución se reanuda en el bloque de prueba principal:

    • Línea 15 : Se ejecuta la línea 15 (imprime 2).
    • Línea 16: MyExc1 se lanza en el bloque finalmente de main().
    • Línea 16: MyExc1 aborta la propagación de MyExc2.
    • Línea 16: MyExc1 comienza a desenrollarse la pila (y todavía está sujeto al bloqueo finalmente de main).
  4. Excepción de bloqueo final:

    • Línea 23: Se lanza una excepción en el bloque finalmente de main().
    • Línea 23: La excepción cancela la propagación de MyExc1.
    • Línea 23: La excepción comienza a desenredarse subir la pila.

Salida:

La salida final es "132Exception en el hilo principal MyExc1" porque la excepción que se propaga del método principal es MyExc1 arrojado en la línea 16. MyExc2 arrojado en la línea 19 se cancela cuando MyExc1 se lanza en la línea 16.

Ú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