Je n'ai jamais bien compris l'utilisation de la déclaration finally. Quelqu'un peut-il me dire quelle est la différence entre:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
} finally {
do;
some;
cleanup;
}
d'une part et:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
}
do;
some;
cleanup;
De l'autre
Ils diffèrent si
try
- se termine en lançant un Java.lang.Throwable
qui n'est pas un Java.lang.Exception
, par exemple parce qu'il s'agit d'un Java.lang.Error
tel que AssertionError
ou OutOfMemoryError
.continue
, break
ou return
Plus généralement, le langage Java garantit qu'un bloc finally est exécuté avant la fin de l'instruction try. (Notez que si l'instruction try ne se termine pas, il n'y a aucune garantie sur le finalement. A peut ne pas se terminer pour diverses raisons, notamment l'arrêt du matériel, l'arrêt du système d'exploitation, l'arrêt VM (par exemple en raison de System.exit
), le thread en attente (Thread.suspend()
, synchronized
, Object.wait()
, Thread.sleep()
) ou être autrement occupé (boucles sans fin, ,).
Ainsi, un bloc finally
est un meilleur endroit pour les actions de nettoyage que la fin du corps de la méthode, mais en soi, il ne peut toujours pas garantir l'exécution du nettoyage.
finally
block s'exécute toujours.
finally
block est utilisé pour le nettoyage, comme pour libérer les ressources utilisées dans try
/catch
, fermer les connexions db, fermer les sockets, etc. même lorsqu'une exception non gérée se produit dans votre try
/catch
bloc.
La seule fois où le bloc finally
ne s'exécute pas est lorsquesystem.exit()
est appelée dans try
/catch
ou une erreur se produit au lieu d'une exception.
L'erreur dans la description ci-dessus signifie quand Java sortie d'application avec des conditions comme une erreur de mémoire insuffisante. Je vois quelques downvotes :( pour cette raison, il semble.
La principale différence est que la section catch
peut elle-même lever une exception, sortir d'un bloc environnant ou revenir de la méthode actuelle. Dans ce cas do; some; cleanup;
n'est pas exécuté.
Avec un bloc finally
, c'est garanti que ce code sera exécuté.
C'est fondamentalement une mauvaise idée d'attraper toutes les exceptions - vous devez donc considérer ce qui se passera si une exception non interceptée se propage hors de votre bloc try/catch ou try/catch/finally. Enfin les blocs vous permettent de nettoyer en sortant.
Aussi:
En bref, si vous voulez que du code soit exécuté lorsque vous quittez le bloc try/catch cependant vous le quittez (à part que le processus se termine très dur), c'est enfin votre ami.
Dans le bon style de codage, vous ne voulez pas tout faire comme ci-dessous.
try{
[some task]
}
catch
{
}
Ce que vous voulez faire, c'est détecter des erreurs connues spécifiques.
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
[Cleanup]
Dans ce cas, votre code de nettoyage ne sera pas exécuté en cas de nouvelle erreur. Nous ajoutons donc le finalement qui sera exécuté même si une nouvelle erreur est levée.
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
finally
{
[Cleanup]
}
Le bloc "enfin" s'exécutera toujours.
Dans votre deuxième exemple, le nettoyage ne se produira pas si le bloc catch rejette l'exception ou si une exception non interceptée s'est produite dans le bloc try.
Du forum this sur GeekInterview:
Le bloc finally s'exécute toujours à la fin du bloc try. Cela garantit que le bloc finally est exécuté même si une exception inattendue se produit. Mais est finalement utile pour plus que la gestion des exceptions - cela permet au programmeur d'éviter que le code de nettoyage soit accidentellement contourné par un retour, une poursuite ou une interruption. Placer du code de nettoyage dans un bloc finally est toujours une bonne pratique, même lorsqu'aucune exception n'est prévue.
Dans le premier exemple, le bloc finally est toujours exécuté même si vous avez une instruction return dans la clause try. Le seul moment où il n'est pas exécuté est lorsque vous avez System.exit (0).
Une seule explication:
que vous ayez ou non détecté une exception, les codes du bloc finally
seront exécutés.
la différence entre les deux morceaux que vous avez donnés ici est: les codes dans le morceau sans utiliser finally
ne seront jamais exécutés.
pour bien comprendre finally
, tout ce que vous devez savoir, c'est que finally
= garantie!
vous pouvez l'utiliser pour nettoyer, pour aider à la convivialité ou pour réessayer quelque chose