Un bloc finally est toujours exécuté?
Est-il une condition où enfin peut ne pas fonctionner en java? Merci.
- Est-ce une question que vous pourriez me le demande lorsque vous essayez d'obtenir un emploi avec une certaine compagnie bien connue?
- Soins de nom il? (Dieu, j'ai manqué de quel âge ce post a été!)
- Je ne veux pas donner le match à l'extérieur, mais vous pouvez google.
Vous devez vous connecter pour publier un commentaire.
de la Soleil Tutoriels
Je ne sais pas du tout comment le bloc finally ne pas exécuter...
Système.sortie s'arrête la Machine Virtuelle.
"au revoir" ne pas imprimer dans le code ci-dessus.
Juste pour élargir sur ce que les autres ont dit, tout ce qui n'est pas à cause de quelque chose comme la JVM sortie entraînera le bloc finally. Donc la méthode suivante:
sera étrangement à la fois de compiler et de rendement 1.
Relatifs au Système.à la sortie, il y a également certains types de défaillance catastrophique où un bloc finally ne peut pas s'exécuter. Si la JVM est à court de mémoire entièrement, il peut juste sortir sans prise ou enfin qui se passe.
Plus précisément, je me souviens d'un projet où nous avons vainement essayé d'utiliser
Cela n'a pas fonctionné parce que la JVM n'avait pas de mémoire pour exécuter le bloc catch.
Dans ce cas la, enfin, de ne pas exécuter (à moins que le obsolète
Thread.stop
est appelé, ou un équivalent, disons, à travers une interface d'outils).throw
, puis lefinally
bloc à exécuter comme prévu.try { throw new ThreadDeath(); } finally { System.err.println("?"); }
Le Soleil tutoriel a été, à tort, cité ici dans ce fil.
Remarque: Si la JVM sorties alors que le try ou catch code est exécuté, le bloc finally sera pas exécuter. De même, si le thread exécutant le try ou catch code est interrompu ou tué, le bloc finally sera pas exécuter même si l'ensemble de la demande se poursuit.
Si vous regardez vers le soleil tutoriel étroitement pour finalement bloquer, il ne dit pas "ne pas exécuter", mais "ne peut pas exécuter"
Ici est la description correcte
La raison de ce comportement est, l'appel au système.exit() est transformé en un système d'exécution de fil qui peut prendre du temps pour l'arrêt de la jvm, en attendant planificateur de threads peut demander enfin à exécuter. Donc, finalement, est conçu pour toujours exécuter, mais si vous êtes à l'arrêt de la jvm, il peut arriver que la jvm s'arrête avant d'enfin arriver en cours d'exécution.
Également si un blocage/absence de cycle non productif qui se passe à l'intérieur de
try
bloc.Voici le code qui le démontre:
Ce code génère la sortie suivante:
et "enfin" n'est jamais imprimé
Voici quelques conditions qui permet de contourner un bloc finally:
Dernier non-démon quitte thread exemple:
De sortie:
Dans les cas suivants, enfin le bloc ne sera pas exécuté :-
System.exit(0)
est appelé à partir detry
bloc.try
blocIl peut aussi y avoir d'autres frange cas, où enfin le bloc ne sera pas exécuté.
Il y a deux façons d'arrêter enfin de bloquer l'exécution de code:
1. L'Utilisation Du Système.exit();
2. Si en quelque sorte le contrôle de l'exécution n'arrivez pas à bloc try.
Voir:
Je suis venu à travers un cas très spécifique du bloc finally n'exécute pas spécifiquement lié à la play framework.
J'ai été surpris de constater que le bloc finally dans cette action de contrôleur du code que m'a appelé après qu'une Exception, mais jamais lorsque l'appel a réussi.
Peut-être le thread est terminé ou quelque chose quand renderBinary() est appelée. Je soupçonne la même chose se produit pour d'autres render() appelle, mais je n'ai pas le vérifier.
J'ai résolu le problème en déplaçant le renderBinary() d'après le try/catch. Une enquête ultérieure a révélé que procure le jeu, un @Enfin annotation pour créer une méthode qui est exécutée après une action de contrôleur exécute. L'inconvénient ici est que ce sera appelée après l'exécution de TOUTE action dans le contrôleur, donc il peut ne pas toujours être un bon choix.