192 votes

Est-ce que finalement un bloc s'exécute même si vous lancez une nouvelle exception?

Dans ce code, someVar sera défini même si le bloc catch est exécuté et que la deuxième exception est levée?

 public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
 

228voto

GaryF Points 11921

Oui, enfin blocs court toujours... sauf quand:

  • Le thread exécutant le try-catch-finally bloc est tué ou interrompu
  • Vous utilisez le Système.exit(0);
  • Le sous-jacentes de la VM est détruit lors d'une autre façon
  • Le matériel sous-jacent est inutilisable en quelque sorte

En outre, si une méthode dans votre bloc finally lève une exception non interceptée, puis plus rien après, qui sera exécuté (c'est à dire l'exception sera levée, comme il le ferait dans n'importe quel autre code). Un cas très commun où cela se produit est - java.sql.Connection.close().

En aparté, je suppose que l'exemple de code que vous avez utilisé n'est qu'un exemple, mais être prudent de mettre de la logique réelle à l'intérieur d'un bloc finally. Le bloc finally est prévu pour les ressources de nettoyage (fermeture DB connections, libérant les descripteurs de fichiers, etc), pas de must-exécuter la logique. Si il doit exécuter de le faire avant le bloc try-catch, loin de quelque chose qui pourrait jeter une exception, que votre intention est presque certainement fonctionnellement le même.

12voto

froadie Points 15184

Oui.

Voir la documentation:

Le bloc finally est toujours exécuté lorsque le bloc try sorties.

Exceptions:

Remarque: Si la JVM sorties alors que le coup d'essayer ou attraper code est exécuté, puis le bloc finally ne peut pas s'exécuter. De même, si le fil de l'exécution de la try ou catch code est interrompu ou tué, le bloc finally ne peut pas exécuter même si l'application que l'ensemble continue.

1voto

pmu Points 331

Le bloc finally est toujours exécuté à la fermeture du bloc try, à moins que System.exit (0) soit dans votre try ou catch.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X