C'est ce que Wikipedia dit à propos de clause finally:
La plus courante est une disposition à
(enfin, ou de s'assurer) qui est exécutée
si une exception s'est produite ou non,
généralement de libérer des ressources
acquis dans le corps de la
exception-le bloc de gestion.
Nous allons disséquer votre programme.
try {
System.out.print(1);
q();
}
Donc, 1
sera de sortie sur l'écran, puis q()
est appelé. En q()
, une exception est levée. L'exception est alors pris en Exception y
mais il ne fait rien. Une enfin, la clause est alors exécuté (il), donc, 3
sera imprimé à l'écran. Parce que (dans la méthode q()
il y a une exception dans le enfin clause, aussi q()
méthode passe l'exception de la mère de la pile (par l' throws Exception
dans la déclaration de la méthode) new Exception()
sera levée et a pris en catch ( Exception i )
, MyExc2
exception sera levée (pour l'ajouter à la pile d'exception), mais enfin dans l' main
bloc sera exécuté en premier.
Donc,
catch ( Exception i ) {
throw( new MyExc2() );
}
finally {
System.out.print(2);
throw( new MyExc1() );
}
Une enfin, la clause est appelée...(rappelez-vous, nous avons juste pris Exception i
et jeté MyExc2
) dans son essence, 2
est imprimé sur l'écran...et après l' 2
est imprimé à l'écran, MyExc1
exception est levée. MyExc1
est gérée par l' public static void main(...)
méthode.
Sortie:
"132Exception dans le thread principal MyExc1"
Conférencier est correct! :-)
En essence, si vous avez un enfin dans un try/catch clause, enfin, sera exécuté (après la capture de l'exception avant de lancer l'exception interceptée)