Excepción lanzada en la cláusula catch y finalmente

Resuelto Jubstuff asked hace 13 años • 13 respuestas

En una pregunta sobre Java en la universidad, había este fragmento de código:

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();
        }
    }
}

Me pidieron que diera su resultado. Respondí 13Exception in thread main MyExc2, pero la respuesta correcta es 132Exception in thread main MyExc1. ¿Por qué es eso? Simplemente no puedo entender adónde MyExc2va.

Jubstuff avatar Sep 23 '10 21:09 Jubstuff
Aceptado

Al leer su respuesta y ver cómo se le ocurrió, creo que cree que una "excepción en progreso" tiene "precedencia". Tenga en cuenta:

Cuando se lanza una nueva excepción en un bloque catch o en un bloque finalmente que se propagará fuera de ese bloque, la excepción actual será abortada (y olvidada) a medida que la nueva excepción se propague hacia afuera. La nueva excepción comienza a desenrollarse la pila como cualquier otra excepción, abortando el bloque actual (el bloque catch o finalmente) y sujeta a cualquier bloque catch o finalmente aplicable a lo largo del camino.

Tenga en cuenta que los bloques catch o finalmente aplicables incluyen:

Cuando se lanza una nueva excepción en un bloque catch, la nueva excepción todavía está sujeta al bloque finalmente de esa captura, si corresponde.

Ahora vuelva sobre la ejecución recordando que, cada vez que presione throw, debe cancelar el seguimiento de la excepción actual y comenzar a rastrear la nueva excepción.

Bert F avatar Sep 23 '2010 14:09 Bert F

Las excepciones en el bloque finalmente reemplazan a las excepciones en el bloque catch.

Especificación del lenguaje Java

Si el bloque catch se completa abruptamente por el motivo R, entonces se ejecuta el bloque finalmente. Entonces hay una opción:

  • Si el bloque finalmente se completa normalmente, entonces la declaración try se completa abruptamente por el motivo R.

  • Si el bloque finalmente se completa abruptamente por el motivo S, entonces la declaración try se completa abruptamente por el motivo S (y el motivo R se descarta).

Roland avatar Mar 27 '2014 17:03 Roland