Le bloc finally est-il toujours exécuté en Java ? Analyse complète avec code

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Le bloc finally en Java : mythes, réalité et pièges

\n\n

Chaque développeur Java, du débutant au senior, rencontre tôt ou tard le bloc finally. Les manuels disent : « Ce bloc s'exécute toujours, qu'une exception soit levée ou non ». Cela semble être une garantie en béton, n'est-ce pas ? Mais regardons derrière le rideau.

\n\n

Sur StackOverflow, la question « Does a finally block always get executed in Java? » a rassemblé des milliers de vues et des centaines de commentaires. Les programmeurs expérimentés débattent, les débutants sont perdus, et les cas réels montrent : « toujours » n'est pas une vérité absolue. Dans cet article, nous analyserons tous les scénarios, écrirons du code réel et découvrirons quand finally peut vous décevoir.

\n\n

Comment fonctionne finally ? Exemple de base

\n\n

Pour commencer, le classique. Le bloc finally est utilisé pour libérer des ressources : fermeture de fichiers, connexions à la base de données, sockets. Il s'exécute après try (et catch, si une exception a été levée), mais avant que le contrôle ne quitte la méthode.

\n\n
public class FinallyDemo {\n    public static void main(String[] args) {\n        try {\n            System.out.println("Dans try");\n            int result = 10 / 2; // Tout va bien\n        } catch (ArithmeticException e) {\n            System.out.println("Exception attrapée : " + e.getMessage());\n        } finally {\n            System.out.println("Bloc finally exécuté !");\n        }\n        System.out.println("Le programme continue...");\n    }\n}
\n\n

Sortie :

\n
Dans try\nBloc finally exécuté !\nLe programme continue...
\n\n

Tout est prévisible. Mais que se passe-t-il si une exception non attrapée se produit dans try ?

\n\n
public class FinallyWithUncaught {\n    public static void main(String[] args) {\n        try {\n            System.out.println("Tentative de division par zéro...");\n            int result = 10 / 0; // Exception !\n        } finally {\n            System.out.println("Finally s'exécute AVANT que l'exception ne remonte");\n        }\n        // Cette ligne ne s'exécutera pas\n        System.out.println("Cette ligne ne sera pas affichée");\n    }\n}
\n\n

La sortie surprendra les débutants :

\n
Tentative de division par zéro...\nFinally s'exécute AVANT que l'exception ne remonte\nException in thread "main" java.lang.ArithmeticException: / by zero\n    at FinallyWithUncaught.main(FinallyWithUncaught.java:5)
\n\n

Le bloc finally s'est exécuté, même si l'exception n'a pas été traitée. C'est précisément ce comportement qui a créé le mythe du « toujours ». Mais creusons plus profondément.

\n\n

Quand finally NE s'exécute-t-il PAS ? Scénarios réels

\n\n

Il existe au moins trois situations où finally peut ne pas s'exécuter. Souvenez-vous-en – cela vous fera gagner des heures de débogage.

\n\n

1. System.exit() – arrêt d'urgence de la JVM

\n\n

Le cas le plus connu. Si System.exit(0) est appelé dans le bloc try, la JVM s'arrête instantanément et finally ne s'exécute pas.

\n\n
public class FinallyAndExit {\n    public static void main(String[] args) {\n        try {\n            System.out.println("Début du travail...");\n            System.exit(0); // La JVM s'arrête ici\n        } finally {\n            // Ce code NE s'exécutera PAS !\n            System.out.println("Vous pensiez que je m'exécuterais ? Et bien non !");\n        }\n    }\n}
\n\n

Sortie :

\n
Début du travail...
\n\n

Pourquoi cela ? Parce que System.exit() arrête la machine virtuelle au niveau du système d'exploitation. Ce n'est pas une exception – c'est un ordre de « mourir ». Le bloc finally n'a tout simplement pas le temps de s'exécuter.

\n\n
\n Important : Si vous utilisez System.exit() dans votre code, arrêtez. C'est une mauvaise pratique. Pour terminer un programme, ut

Blogs

Book Recommendations