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'?? ");
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 finally
toujours soit exécuté est que ce n'est pas le cas pour la première ligne suivant le bloc entier
catch
laisse passer une partie jetableLe 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.
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");
}
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