web-dev-qa-db-fra.com

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

someVar sera défini dans ce code 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;
    }
}
121
jax

Oui, les blocs finally fonctionnent toujours ... sauf quand:

  • Le thread exécutant le bloc try-catch-finally est tué ou interrompu 
  • Vous utilisez System.exit(0);
  • Le VM sous-jacent est détruit d'une autre manière
  • Le matériel sous-jacent est inutilisable

De plus, si une méthode de votre bloc finally génère une exception non capturée, aucune action ne sera exécutée après celle-ci (c’est-à-dire que l’exception sera levée comme dans tout autre code). Un cas très fréquent où cela se produit est Java.sql.Connection.close().

En passant, je suppose que l'exemple de code que vous avez utilisé n'est qu'un exemple, mais faites attention à ne pas insérer la logique dans un bloc finally. Le bloc finally est destiné au nettoyage des ressources (fermeture des connexions à la base de données, libération des descripteurs de fichier, etc.), pas à la logique d'exécution obligatoire. Si vous devez exécuter le programme avant le bloc try-catch, éloignez-vous de tout ce qui pourrait jeter une exception, car votre intention est presque certainement la même sur le plan fonctionnel.

155
GaryF

Oui. 

Voir la documentation :

Le bloc finally always est exécuté lorsque le bloc try se termine.

Exceptions:

Remarque: Si la machine virtuelle Java se ferme pendant l’essai ou le code de capture est en cours d'exécution, alors le bloc finally ne peut pas exécuter . De même, si le thread exécutant le fichier try ou catch code est interrompu ou tué, le bloc final ne peut pas exécuter même si l'application en tant que l'ensemble continue.

9
froadie
1
urmalp

Oui. Le bloc finally est toujours exécuté sauf le cas où vous appelez System.exit () car il arrête la machine virtuelle Java.

1
Vladimir Ivanov

Enfin, le bloc est toujours exécuté.

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

 Java Try Catch Finally Block with Throw 

0
Vasanth Umapathy

Enfin, toujours exécuté, peu importe votre cas, c’est-à-dire 

  • bloc try-catch-finally
  • jette 

Pour les exceptions non contrôlées, que Java ne commande pas, traitement des erreurs ..__, raison pour laquelle, si une exception non vérifiée survient dans bloc final et qu'aucune gestion n'est effectuée, le code écrit en dessous de ce point (où une erreur s'est produite) ne sera pas réalisé.

Je suggère donc de toujours gérer toutes les exceptions, que cette option soit cochée ou non . De cette façon, vous pouvez vous assurer que le bloc de code dans enfin est également exécuté, peu importe si une exception non cochée se produit également. vous avez une place dans la capture de sous-nids et enfin vous bloquez pour que votre travail nécessaire soit effectué.

0
yug