web-dev-qa-db-fra.com

comment utiliser enfin

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

42
Martijn

Ils diffèrent si

  • le bloc 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.
  • le bloc try se termine brusquement à l'aide d'une instruction de flux de contrôle telle que continue, break ou return
  • le catch-block se termine brusquement (en lançant tout jetable, ou en utilisant une instruction de flux de contrôle)

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.

38
meriton

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.

30
YoK

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é.

19
Dan

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:

  • Le bloc catch peut lever une exception
  • Vous voudrez peut-être revenir du bloc d'essai

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.

11
Jon Skeet

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]
}
9
Jonathan Park

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.

7
iandisme

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.

3
Kyra

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).

0
Nada Aldahleh

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

0
ligerdave