129 votes

Blocs Java Try Catch Finally sans Catch

Je passe en revue un nouveau code. Le programme comporte uniquement un bloc try et un bloc finally. Puisque le bloc catch est exclu, comment le bloc try fonctionne-t-il s'il rencontre une exception ou tout autre élément pouvant être lancé ? Passe-t-il directement au bloc finally ?

2 votes

25 votes

@mP Tout le monde devrait faire des revues de code et c'est en leur posant des questions qu'on apprend et qu'on s'améliore.

137voto

duffymo Points 188155

Si l'un des codes du bloc d'essai peut lancer une exception vérifiée, il doit apparaître dans la clause throws de la signature de la méthode. Si une exception non vérifiée est levée, elle est supprimée de la méthode.

Le bloc final est toujours exécuté, qu'une exception soit levée ou non.

12 votes

Le premier paragraphe n'est pas nécessairement vrai. Les blocs d'essai peuvent être imbriqués. Toute exception non attrapée, non vérifiée ou non, sortira de la méthode.

4 votes

Les blocs d'essai peuvent être imbriqués, mais je ne le recommande pas. Je n'écris pas de code de cette façon.

2 votes

@duffymo : Quel est le sens de "bubbled out of the method" ?

96voto

Peter Lawrey Points 229686

Une petite note sur try / finally : Le finally s'exécutera toujours sauf si

  • System.exit() s'appelle.
  • La JVM se bloque.
  • Le site try{} le bloc ne se termine jamais (par exemple, une boucle sans fin).

4 votes

Qu'en est-il try{..} catch{ throw ..} finally{..} ? Je pense qu'il ne sera finalement pas exécuté.

13 votes

Dans ce cas, finally sera toujours appelé. Seule l'exception originale est perdue.

0 votes

Enfin, il ne sera pas non plus exécuté si vous appelez System.exit() avant.

39voto

Carlos Heuberger Points 11804

La spécification du langage Java (1) décrit comment try-catch-finally est exécuté. Ne pas avoir de catch est équivalent à ne pas avoir de catch capable d'attraper le Throwable donné.

  • Si l'exécution du bloc try se termine brusquement à cause d'un throw d'une valeur V, il y a alors un choix à faire :

    • Si le type d'exécution de V peut être attribué au paramètre d'une clause catch de l'instruction try, alors

    • Si le type d'exécution de V n'est pas assignable au paramètre d'une clause catch de l'instruction try, puis le bloc final est exécuté . Il y a donc un choix à faire :

      • Si le bloc finally se termine normalement, alors l'instruction try se termine brusquement à cause d'un throw de la valeur V.
      • Si le bloc finally se termine brusquement pour la raison S, alors l'instruction try se termine brusquement pour la raison S (et le jet de la valeur V est écarté et oublié).

(1) Exécution de try-catch-finally

6voto

Roboprog Points 2005

Le bloc finally est toujours exécuté après la fin du bloc try, que ce dernier se termine normalement ou anormalement en raison d'une exception, euh, d'un élément à lancer.

Si une exception est levée par l'un des codes du bloc try, la méthode en cours relance simplement (ou continue de lancer) la même exception (après avoir exécuté le bloc finally).

Si le bloc final lève une exception/erreur/objet à lancer, et qu'il y a déjà un objet à lancer en attente, cela devient désagréable. Très franchement, j'ai oublié ce qui se passe exactement (tant pis pour ma certification d'il y a des années). I pensez à les deux throwables sont liés ensemble, mais il y a un certain voodoo spécial que vous devez faire (i.e. - un appel de méthode que je devrais chercher) pour obtenir le problème original avant que le "finally" ne vomisse, euh, ne soit rejeté.

Incidemment, try/finally est une chose assez courante à faire pour la gestion des ressources, puisque Java n'a pas de destructeurs.

Par exemple -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

"Enfin", un dernier conseil : si vous faire Il est difficile de mettre un catch, soit un catch spécifique (attendu) des sous-classes de throwable, soit un catch "Throwable", pas "Exception", pour un piège à erreurs général et fourre-tout. Trop de problèmes, tels que les erreurs de réflexion, génèrent des "Erreurs" plutôt que des "Exceptions", et ceux-ci échapperont à tout "catch all" codé en tant que :

catch ( Exception e) ...  // doesn't really catch *all*, eh?

faites ceci à la place :

catch ( Throwable t) ...

0 votes

Voir la réponse de Carlos Heuberger ci-dessous pour la partie laide.

2voto

Andy Thomas Points 30979

Comment le bloc d'essai fonctionne-t-il s'il rencontre une exception ou un élément jetable

L'exception est jetée hors du bloc, comme dans tout autre cas où elle n'est pas attrapée.

Le bloc finally est exécuté quelle que soit la façon dont le bloc try est sorti -- qu'il y ait ou non des catchs, qu'il y ait ou non un catch correspondant.

Les blocs catch et finally sont des parties orthogonales du bloc try. Vous pouvez avoir l'un ou l'autre ou les deux. Avec Java 7, vous ne pourrez plus avoir ni l'un ni l'autre !

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