Maison > Java > javaDidacticiel > Pourquoi l'extrait de code produit-il la sortie « 132Exception dans le thread principal MyExc1 » malgré le fait qu'une exception MyExc2 soit levée dans le bloc catch ?

Pourquoi l'extrait de code produit-il la sortie « 132Exception dans le thread principal MyExc1 » malgré le fait qu'une exception MyExc2 soit levée dans le bloc catch ?

Barbara Streisand
Libérer: 2024-10-29 22:30:29
original
762 Les gens l'ont consulté

Why does the code snippet produce the output

Gestion des exceptions dans les blocs Catch et Enfin

Lors d'une récente mission Java universitaire, un étudiant a rencontré l'extrait de code suivant et a été invité à prédire sa sortie :

<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();
        }
        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();
        }
    }
}</code>
Copier après la connexion

Lorsque l'étudiant a répondu par "13Exception dans le fil principal MyExc2", il a été surpris de découvrir que la bonne réponse était "132Exception dans le fil principal MyExc1."

Comprendre la propagation des exceptions dans les blocs Catch et Enfin

Pour comprendre le résultat correct, il est crucial de comprendre le comportement des exceptions dans les blocs Catch et Enfin. Selon le mécanisme de gestion des exceptions de Java :

  1. Lorsqu'une exception est levée dans un bloc catch ou final qui sera propagé hors de ce bloc, l'exception actuelle est automatiquement abandonnée et oubliée.
  2. La nouvelle exception commence à dérouler la pile, en adhérant à tout catch ou enfin aux blocs en cours de route.
  3. Notamment, une nouvelle exception levée dans un bloc catch est toujours soumise au bloc final de ce catch, le cas échéant.

Traçage du flux d'exception

Dans cet esprit, traçons l'exécution de l'extrait de code étape par étape :

  • Le le programme démarre dans la méthode principale et imprime "1".
  • Une exception est levée dans la méthode q et interceptée par le bloc catch dans main.
  • Dans le bloc catch, une nouvelle exception, MyExc2, est lancé. Cela annule l'exception d'origine, MyExc1.
  • L'exception MyExc2 est propagée hors du bloc catch et dans le bloc final.
  • Le bloc final imprime "2". Cependant, avant de quitter la méthode q, le bloc enfin lève une nouvelle exception, qui commence à dérouler la pile.
  • La nouvelle exception est une exception qui n'est pas interceptée dans le bloc catch de la méthode q.
  • L'exception Exception se propage hors de la méthode q et dans le bloc final de la méthode principale.
  • Le bloc final de la méthode principale imprime "3" puis lève une exception MyExc1.
  • L'exception L'exception MyExc1 se propage hors de la méthode principale et est interceptée par la machine virtuelle.

Comprendre le résultat

De ce suivi, nous pouvons voir que :

  • La dernière exception qui se propage hors de la méthode principale est MyExc1.
  • La trace de la pile inclut "132", qui correspond à la sortie imprimée par le programme.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal