188 votes

Exception levée dans le catch et enfin la clause

Mardi, j’ai eu mon examen sur Java à l’université. Alors que j’ai réussi l’examen ( : D) il y a une question à laquelle je n’a pas répondu correctement. Il y avait cet extrait de code :

et on m’a demandé de donner sa sortie. J’ai répondu « 13Exception au thread principal MyExc2 », mais la bonne réponse est « 132Exception en fil MyExc1 principal ». Pourquoi est-ce que ? Je ne comprends pas où va le MyExc2 : S Merci à tous

204voto

Bert F Points 27237

Basé sur la lecture de votre réponse et de voir comment vous vous êtes probablement venu avec elle, je crois que vous pensez que "l'exception " en cours" a "priorité". Gardez à l'esprit:

Lorsqu'une nouvelle exception est levée dans un bloc catch, ou enfin le bloc qui va se propager hors de ce bloc, à l'exception en cours sera interrompue (et oublié) que la nouvelle exception est propagée vers l'extérieur. La nouvelle exception commence déroulement de la pile, tout comme toute autre exception, l'abandon de l'actuel bloc (le bloc catch ou finally) et sous réserve de toute loi de capture ou enfin les blocs le long de la voie.

Notez que échéant attraper ou enfin les blocs comprend:

Lorsqu'une nouvelle exception est levée dans un bloc catch, la nouvelle exception est toujours sous réserve que la prise du bloc finally, le cas échéant.

Maintenant retracer l'exécution de rappeler que, chaque fois que vous frappez throw,, vous devez interrompre le traçage de l'exception en cours et démarrer le suivi de la nouvelle exception.

64voto

Roland Points 787

Citant le JLS 8: 14.20.2. L'exécution de essayez-enfin, et try-catch-finally

Si le bloc catch termine brusquement de raison R, alors la enfin le bloc est exécuté. Puis il y a le choix:

  • Si le bloc finally se termine normalement, puis l'instruction try termine brusquement pour une raison R.

  • Si le bloc finally est terminée brusquement pour des raisons de S, puis l'essayer instruction se termine brusquement pour des raisons de S (et la raison R est supprimée).

42voto

Buhake Sindi Points 38654

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)

25voto

Alexander Pogrebnyak Points 24964

Enfin la clause est exécutée même lorsque l’exception est levée à partir n’importe où dans le bloc try/catch.

Parce que c’est le dernier à être exécuté dans le `` et lève une exception, qui est l’exception qui voient le nombre d’appelants.

D'où l’importance de s’assurer que le clause ne lève pas n’importe quoi, car il peut avaler des exceptions à la bloc.

10voto

Garis M Suero Points 4005

Un method peut pas throw deux exceptions près en même temps. Il sera toujours jeter le dernier jeté exception, ce qui dans ce cas, il sera toujours l'un de l' finally bloc.

Lors de la première exception à partir de la méthode q() est jeté, il va attraper ed et puis avalé par le bloc finally levée d'une exception.

q() -> jetés new Exception -> main catch Exception -> throw new Exception -> finally jeter un nouveau exception (et de celui de l' catch est "perdu")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X