Maison >Java >javaDidacticiel >Comment fonctionne la propagation des exceptions lorsque des exceptions sont levées dans des blocs catch et finalement en Java ?

Comment fonctionne la propagation des exceptions lorsque des exceptions sont levées dans des blocs catch et finalement en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 20:09:03933parcourir

How does exception propagation work when exceptions are thrown within catch and finally blocks in Java?

Propagation des exceptions dans les blocs Catch et Enfin

Dans un programme Java, lorsqu'une exception se produit, elle se propage à travers la pile jusqu'à ce qu'elle soit gérée par un bloc catch approprié ou termine le programme. Cependant, des exceptions peuvent également être levées dans des blocs catch ou enfin, ce qui soulève des questions sur leur comportement de propagation.

Considérez l'extrait de code suivant :

<code class="java">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(); // Exception thrown in catch block
        }
        finally {
            System.out.print(2);
            throw new MyExc1(); // Exception thrown in finally block
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception(); // Exception thrown in finally block
        }
    }
}</code>

Lorsqu'une exception est levée dans un catch ou final block, le principe suivant s'applique :

Exception Overriding : Si une nouvelle exception est levée dans un catch ou un bloc final destiné à se propager hors de ce bloc, l'exception actuelle est en cours sera avortée et la nouvelle exception se propagera vers l'extérieur, prenant sa place. L'exception abandonnée sera ignorée.

Dans le code fourni, le scénario d'exception dans les blocs catch et final démontre ce principe :

  • Catch Block : Lorsque l'exception i est levée dans le bloc catch, elle est immédiatement remplacée par la nouvelle exception MyExc2, qui devient l'exception en cours.
  • Enfin Bloquer : De même, lorsque l'exception est levée dans le bloc final, il remplace l'exception MyExc2 actuelle par MyExc1, ce qui en fait la nouvelle exception en cours.

Par conséquent, lorsque l'exécution du programme atteint la méthode principale après avoir déroulé la pile, l'exception MyExc2 a a été remplacé par MyExc1, qui est ensuite imprimé et géré. Par conséquent, la sortie correcte est "132Exception dans le thread principal MyExc1."

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