Gestion des exceptions dans les clauses Catch et Enfin
Lorsque vous traitez la gestion des exceptions en Java, il est crucial de comprendre l'interaction entre les clauses catch et enfin . Considérons l'exemple suivant fourni pour un devoir universitaire :
<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>
La question demandait la sortie de ce code. Alors que certains ont peut-être répondu « 13Exception dans le fil principal MyExc2 », la bonne réponse est « 132Exception dans le fil principal MyExc1 ».
Pourquoi MyExc2 disparaît
La clé pour comprendre le résultat correct réside dans le comportement des clauses catch et enfin. Lorsqu'une exception est levée dans un bloc catch ou final, cela a des implications significatives sur le flux. Voici une répartition :
Exception dans le bloc final : De même, si une nouvelle exception est levée un bloc final, l'exception d'origine est également abandonnée. Cependant, il y a un point crucial à noter :
En traçant les exceptions
En traçant l'exécution sur la base de ces principes, nous pouvons voir que :
Bloc catch dans main :
Enfin bloquer dans le bloc principal :
Par conséquent, le résultat correct est « 132Exception dans le thread principal MyExc1 ». L'exception MyExc2 est "oubliée" car une nouvelle exception (MyExc1) est levée dans le bloc final du bloc catch qui gérait MyExc2.
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!