web-dev-qa-db-fra.com

Quel est l'avantage d'utiliser "finalement" après le bloc try-catch en java?

Le bloc "finalement" est toujours exécuté à la fin du try-catch, en cas d'exception ou non. Mais aussi chaque ligne de code à l'extérieur et après le try-catch est toujours exécutée. Alors, pourquoi devrais-je utiliser l'instruction finally?

Exemple:

try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    System.out.println("This line is always printed");
}
System.out.println("Also this line is always printed !! So why to use 'finally'?? ");
40
Aarath

Le cas le plus utile est lorsque vous devez libérer certaines ressources:

InputStream is = ...
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    is.close();
}

Plus généralement, vous l'utilisez lorsque vous voulez être sûr que votre code est exécuté à la fin, même s'il y a eu une exception lors de l'exécution:

long startTime = System.currentTimeMillis();
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    long endTime = System.currentTimeMillis();
    System.out.println("Operation took " + (endTime-startTime) + " ms");
}

L'idée que ce bloc finallytoujours soit exécuté est que ce n'est pas le cas pour la première ligne suivant le bloc entier

  • si le bloc catch laisse passer une partie jetable
  • s'il se renverse une exception, ce qui est très fréquent
22
Denys Séguret

Le dernier System.out.println (après le bloc finally) ne sera exécuté que si l'exception levée dans le bloc try est effectivement interceptée avec un bloc catch et si l'exécution n'est pas interrompue par ex. une déclaration de retour.

Dans votre exemple, le bloc finally sera toujours exécuté, mais l'exécution ne continuera au-delà du bloc finally que si aucun Error n'est jeté dans le bloc try (il ne sera pas intercepté), si aucun Throwable est jeté dans le bloc catch et aucune autre instruction n'interrompt l'exécution.

7
jarnbjo

Mais aussi chaque ligne de code à l'extérieur et après le try-catch est toujours exécutée

Ceci est une erreur. En cas d'exceptions non contrôlées (RuntimeException, Error et leurs sous-classes), le code après finally ne s'exécutera pas.

Jetez un oeil à ce code

public static void main(String[] args) {
    try{
        someDengerousMethod();
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        System.out.println("finally block");
    }
    System.out.println("after finally...");
}
public static void someDengerousMethod(){
    throw new Error("something went wrong");
}
4
Pshemo

Le bloc enfin est un outil clé pour prévenir les fuites de ressources. Lorsque vous fermez un fichier ou récupérez d'autres ressources, placez le code dans un bloc finally pour vous assurer que la ressource est toujours récupérée.

Mais est finalement utile pour plus que la gestion des exceptions - cela permet au programmeur d'éviter d'avoir du code de nettoyage accidentellement contourné par un retour, une continuation ou une interruption. Placer du code de nettoyage dans un bloc finally est toujours une bonne pratique, même si aucune exception n'est prévue.

Plus ici

0
tmwanik