Avez-vous vraiment besoin "enfin" bloc
Il y a 3 permutations d'un try...catch...finally bloc en java.
- try...catch
- try...catch...finally
- essayer...enfin
Une fois le bloc finally est exécuté, le contrôle passe à la ligne suivante après le bloc finally. Si je supprime le bloc finally et déplacer tous ses états à la ligne après le bloc try...catch, qui ont le même effet que de l'avoir dans le bloc finally?
- Cette question a été répondue avant stackoverflow.com/questions/3354823/how-to-use-finally. Si ses un double
- Code dans un bloc finally est garanti! Toujours! Sans exceptions!
- a vous lire les questions avant de les marquer comme en double
- Double Possible de comment utiliser enfin
Vous devez vous connecter pour publier un commentaire.
Je pense que willcode se rapproche le plus à exprimer le point clé ici, et probablement tous les moyens, mais ne sont pas claires.
Le problème est, il est en effet quelque chose de très mal avec ce que vous demandez: "Si j'écris toutes les déclarations après le bloc catch au lieu de les écrire dans le bloc finally, puis ensuite y aurait-il quelque chose de mal?"
Si vous écrivez toutes les déclarations après le bloc catch, ce que tu sous-entends, c'est que
1) Vous serez toujours attraper l'exception.
2) Vous pourrez toujours continuer à la prochaine déclarations après la capture de l'exception.
Cela implique que vous serez toujours continuer l'exécution "normalement" après une exception, qui est généralement quelque chose que vous jamais en fait envie de faire.
Exceptions devrait être qu'exceptionnel. Si vous pouvez, en effet, gérer une exception, il est toujours préférable d'écrire du code pour tenir compte de ces conditions et ne pas conduire à une exception à tous. Si vous suivez ce modèle alors exceptions sont vraiment exceptionnel, des conditions que vous ne pouvait pas prévoir ou tout au plus de ne pas corriger. Vraiment pas prévu, c'est ce que vous devriez viser. Cela signifie en général que vous sont incapables de gérer le vrai exceptions, ce qui signifie également que vous ne doit pas seulement poursuivre l'exécution, souvent à la fin de l'application à la place.
Ce qui est normalement fait est de vous permettre une erreur de propager retour en haut de la pile d'appel. Certains disent que c'est fait sur le risque que quelqu'un plus haut dans la chaîne peut être en mesure de gérer. Je dirais que l'essentiel n'arrive jamais, il y a deux objectifs réels pour ce faire. L'un, il peut être quelque chose que l'utilisateur peut fixer, s'il y en a un. Afin de propager l'erreur jusqu'à ce que vous obtenez à l'endroit où vous pouvez le signaler à l'utilisateur. Ou deux, un utilisateur ne peut pas le réparer, mais vous souhaitez obtenir l'intégralité de la pile d'appel pour le débogage. Ensuite, vous l'attraper en haut à l'échec gracieusement.
Le bloc finally devriez maintenant avoir plus de sens pour vous. Que tout le monde dit qu'il fonctionne toujours. Le plus clair, l'utilisation d'un enfin est vraiment dans un bloc try... finally. Ce que vous êtes en train de dire c'est que si le code fonctionne très bien, très bien. Nous avons encore besoin de faire un peu de ménage et enfin s'exécute toujours alors que nous avançons. Mais si une exception se produit, nous avons maintenant vraiment besoin que, finalement, le bloc parce que nous avons peut-être besoin de faire un peu de ménage, mais nous ne sommes plus de la capture de l'exception ici, donc nous n'allons pas être en mouvement sur plus. Le bloc finally est essentiel de s'assurer que le nettoyage se produit.
L'idée d'une exception toujours l'arrêt de l'exécution peut être difficile pour la personne de saisir jusqu'à ce qu'ils ont une certaine expérience, mais qui est en fait le moyen de toujours faire les choses. Si une erreur s'est produite, soit il était donc mineur, vous devez avoir représenté pour commencer, ou bien il y a juste plus de et plus d'erreurs en attente de se produire en bas de la ligne.
"D'avaler" les erreurs de la capture et de poursuivre, c'est la pire chose que vous pouvez faire, car votre programme devient imprévisible et vous ne pouvez pas trouver et corriger les bugs.
Bien écrit code contiendra autant essayer ... enfin blocs nécessaires pour s'assurer que les ressources sont toujours libérés peu importe le résultat. Mais bien écrite de code, en général, ne contiennent qu'un petit nombre de blocs try ... catch qui existent principalement pour permettre une application échoue avec autant de tact que possible, ou de reporter à l'utilisateur, ce qui signifie qu'au moins toujours passer un message à l'utilisateur, etc. Mais vous n'avez généralement pas juste attraper une erreur et de continuer.
Je sais que c'est une très vieille question, mais je suis tombé aujourd'hui et j'ai été confondu par les réponses apportées. Je veux dire, ils sont tous corrects, mais toutes les réponses théoriques ou de même niveau philosophique quand il est très facile et pratique, la réponse à cette question.
Si vous mettez un retour, pause, continuer, ou tout autre mot-clé java qui change l'ordre d'exécution de code dans le bloc catch (ou même bloc try), les instructions à l'intérieur du bloc finally sera toujours exécuté.
Par exemple:
lors de l'exécution de ce code affichera:
Qui est la raison la plus importante pour l'existence d'un bloc finally. La plupart des réponses impliquent ou le consulter sur les lignes de côté, mais aucun d'entre eux est de mettre l'accent sur elle. Je pense que parce que c'est un peu un newbie question, telle une réponse simple est très important.
Le point culminant est qu'un
finally
bloc est garanti pour être exécutée même si une exception est levée et n'est pas pris. Ensuite, vous utilisez lafinally
bloc, comme une chance, pour effectuer le nettoyage nécessaire comme la fermeture de flux. Le code après le bloc finally, ne pourrait être atteint.De la java tutoriel
Si je comprends bien la question, vous vous demandez quelle est la différence entre:
Et:
Ou, plus probable:
La différence est que, si
new Foo()
ouf.bar()
lancer une exception, lefinally
bloc sera exécuté que dans le premier cas, mais queFoo.baz()
ne sera pas exécuté dans les deux derniers cas: au lieu de contrôle d'ignorerFoo.baz()
alors que la JVM à la recherche d'un gestionnaire d'exception.MODIFIER
De répondre à votre commentaire, ce sujet:
Vous avez raison, en supposant que le
catch
bloc ne pas relever de l'exception, ou de retour de la méthode indiquant une défaillance s'est produite, puisf.baz()
est appelée indépendamment de savoir si il y a une exception. Même dans ce cas, cependant, lafinally
bloc sert de documentationf.baz()
est utilisé pour le nettoyage.Plus important encore, le fait qu'une exception a été levée est généralement important, il est donc très difficile d'écrire du code qui continue de faire tout ce qui était en train de faire, sans savoir qu'une exception a été levée. Il ya des moments que les exceptions indiquer les choses stupides que vous pouvez ignorer, et dans ce cas, vous devez avaler l'exception. Plus souvent, cependant, vous voulez pour signaler l'échec, soit par renvoi à l'exception (ou lancer une autre exception) ou de retour de la méthode avec un code d'erreur.
Par exemple, si
f.bar()
est censé convertir unString
à unDouble
, et en cas d'échec il jette à unNumberFormatException
, puis le code après letry
bloc probablement besoin de savoir que laString
n'a pas été réellement converti enDouble
. Et, donc, en général vous ne souhaitez pas continuer après lacatch
bloc. Au lieu de cela, vous aurez envie de signaler l'échec. Ceci est connu comme "abandon sur panne" (par rapport à "reprendre en cas d'échec," qui devrait probablement être appelé "la confusion après l'échec avec les doigts croisés").Sauf dans des cas particuliers, vous pouvez être en mesure de sortir sur. Par exemple, le
catch
bloc pourrait configurez lesDouble
àDouble.NaN
qui est conçu spécifiquement pour propager les erreurs correctement dans des expressions mathématiques. Même dans ce cas, lefinally
bloc sert de documentationf.baz()
est impliqué dans une sorte de nettoyage.Le bloc finally contient des lignes de code qui doit être exécuté indépendamment de savoir si une exception a été pris ou non. Même si vous décidez d'arrêter l'exécution de code dans la méthode. Donc le code après le t-c-f peut ne pas être exécuté, mais la enfin de code est "garanti" (garanti dans le sens d'une non s'écraser immédiatement la rupture non manipulable d'erreur).
Oui, il y aurait quelque chose de très gravement erronée.
Et qui est, votre code ne fonctionnera si il y a une erreur.
Les instructions à l'intérieur
finally
toujours exécuter, indépendamment de l'exception levée. C'est le point.bloc finally est surtout utilisée au moment de l'exception de prévention. Si une erreur d'exécution se produit, le programme peut conduire à mettre fin. Donc, à ce moment, il appelle enfin à bloc avant de se terminer le programme. Généralement "enfin" contient de connexion déclarations de clôture, les opérations d'enregistrement et le fichier d'entrée, de sortie à proximité de l'exploitation.
Si votre code ne jamais déclenche une exception ou que vous consommez tous les exception qui sera correct. Ce n'est pas ce qui se passe toujours.