Try-catch-finally en java
En Java, le bloc finally est pas exécutée si l'on insère une instruction de retour à l'intérieur de
le bloc d'essai d'un try-catch-finally ?
- Lorsque vous avez essayé, ce qui s'est passé?
- Le
finally
bloc sera toujours exécuté. C'est pourquoi il est appelé enfin 🙂 - Quoi que vous fassiez, ne pas
return
à partir d'un bloc finally. - Une fois (de nombreuses années), j'ai écrit retour de enfin et ensuite passé une demi journée à la recherche du problème, il a causé...
- ideone.com/A6FPa
- vu ce qu'on avait connu "une Fois(de nombreuses années)"
Vous devez vous connecter pour publier un commentaire.
Le seul moment où un
finally
bloc ne sera pas exécuté, c'est quand vous appelezexit()
avantfinally
est atteint. Leexit()
appel de l'arrêt de la JVM, donc pas de ligne de code sera exécuté.EDIT: Ce n'est pas tout à fait correct. Voir les commentaires ci-dessous pour plus d'informations.
System.exit()
est un jeu équitable, n'est-ce pas JNI code de segmentation? 🙂finally
bloc n'est pas exécutée: 1) si le bloc try ou un bloc catch entre dans une boucle infinie, ou des blocs pour toujours, 2) si quelque chose (par exemple un JNI bug) provoque la JVM de l'accident, ou 3) si il existe une machine de panne (de panne de courant, erreur matérielle, etc).Le bloc finally sera toujours exécuté, peu importe si vous revenez, ou une exception est levée dans le bloc try.
Voir également la section 14.19.2 Exécution de try-catch-finally de la Java Language Specification
Le bloc finally est exécuté dans tous ces cas. Le point de l'exécution d'un bloc finally à la fin est de vous permettre de libérer toutes les ressources acquises.
Ci-dessous est un exemple qui montre comment cela fonctionne.
Il est exécuté même si vous retournez à l'intérieur du bloc try. J'ai mis une instruction de retour à l'intérieur de l'essayer ainsi que de l'un à l'intérieur, enfin, et la valeur retournée est de enfin, pas de l'essayer.
La sortie que j'ai eu était "enfin."
Selon la explication officielle:
Je pense que c'est une bonne idée que nous devons consulter le site officiel avant de nous poster une réponse ici.
Quand jamais une méthode tente de retourner à l'appelant, par l'intermédiaire d'une exception non interceptée ou explicite de l'instruction de retour, la clause finally est exécuté juste avant le retour de la méthode.
Si votre bloc finally a un retour, il sera écrasé par le retour dans un bloc try-catch.En raison de cette "fonctionnalité" une bonne pratique est que, finalement, le bloc ne doit jamais lever une exception ou d'avoir une instruction de retour.
Si vous appelez
System.exit()
que quelqu'un d'autre a dit, il ne sera pas exécuté, mais je crois qu'il ne sera pas exécuté si il y a un exception dans le bloc except.