Maison  >  Article  >  Java  >  Pourquoi l'exception levée dans le bloc final est-elle celle qui est finalement signalée en Java ?

Pourquoi l'exception levée dans le bloc final est-elle celle qui est finalement signalée en Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 15:56:02875parcourir

Why is the exception thrown in the finally block the one that is ultimately reported in Java?

Gestion des exceptions en Java : comprendre l'impact des exceptions levées dans les clauses Catch et Enfin

Considérez l'extrait de code suivant :

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(); // throws MyExc1 here
        }
    }

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

Dans cet extrait, nous avons une séquence d'exceptions levées à la fois dans les clauses try-catch et enfin. Le résultat attendu est "132Exception dans le thread principal MyExc1", et non "13Exception dans le thread principal MyExc2."

Comprendre ce résultat nécessite de comprendre le principe fondamental de la gestion des exceptions en Java :

Lorsqu'une nouvelle exception est levée dans une clause catch oufinal qui se propage hors de ce bloc, l'exception actuelle est abandonnée et la nouvelle exception est propagée à la place.

Essentiellement, l'exception actuelle est oubliée, et la nouvelle exception prend en charge le processus de déroulement dans la pile.

Dans le code donné, une exception MyExc1 est levée dans la clause enfin la plus interne. Cette exception finira par se retrouver dans la clause principale finale. Cependant, dans cette clause finale, une autre exception, MyExc1 est levée, interrompant la propagation du MyExc1 d'origine. Par conséquent, MyExc1 de la clause finale la plus externe devient l'exception qui se propage vers l'extérieur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn