Gestion des erreurs en Java : try/catch et bien plus : de A à Z
La gestion des erreurs est l'un des concepts clés en Java que tout développeur doit maîtriser. Contrairement à de nombreux langages, Java offre un système d'exceptions (exceptions) strict et bien pensé, qui permet d'écrire un code fiable et prévisible. Dans cet article, nous allons tout détailler : du try/catch de base aux mécanismes avancés comme try-with-resources et les exceptions personnalisées.
1. Les bases : que sont les exceptions et la hiérarchie des classes
Une exception est un événement qui perturbe le déroulement normal d'un programme. En Java, toutes les exceptions sont des objets de classes héritant de Throwable. Les principales branches de la hiérarchie sont :
- Error — des problèmes critiques qui ne sont généralement pas traités (par exemple,
OutOfMemoryError). - Exception — des exceptions que le programme peut traiter.
- RuntimeException (sous-classe d'Exception) — des exceptions d'exécution qui ne sont pas nécessairement vérifiées à la compilation.
Toutes les exceptions sont divisées en deux types :
- Checked (vérifiées) — obligatoires à traiter. Le compilateur ne compilera pas le code si vous ne les gérez pas avec
try/catchou ne les déclarez pas avecthrows. Exemples :IOException,SQLException. - Unchecked (non vérifiées) — héritent de
RuntimeException. Elles ne nécessitent pas de traitement explicite. Exemples :NullPointerException,ArithmeticException.
2. Le mécanisme de base : try, catch, finally
Le bloc de base pour la gestion des exceptions se compose de trois parties :
try { // Code qui peut lever une exception int result = 10 / 0;} catch (ArithmeticException e) { // Gestion de l'exception System.err.println("Erreur : division par zéro !");} finally { // Ce bloc s'exécute toujours (même en cas d'exception) System.out.println("Bloc finally exécuté.");}Points importants :
- Le bloc
catchpeut être unique ou multiple pour différents types d'exceptions. - Le bloc
finallyest facultatif, mais utile pour fermer les ressources (fichiers, connexions). - Si l'exception n'est pas interceptée, elle remonte la pile d'appels.
Multi-catch (Java 7+) — permet d'intercepter plusieurs types d'exceptions dans un seul bloc :
try { // code} catch (IOException | SQLException e) { System.err.println("Erreur d'entrée-sortie ou SQL : " + e.getMessage());}3. Try-with-resources : fermeture automatique des ressources
Depuis Java 7, un mécanisme try-with-resources a été introduit, qui ferme automatiquement les ressources implémentant l'interface AutoCloseable (ou Closeable). Cela évite d'avoir à écrire un bloc finally pour fermer les fichiers, sockets, etc.
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line = reader.readLine(); System.out.println(line);} catch (IOException e) { System.err.println("Erreur de lecture du fichier : " + e.getMessage());} // reader est fermé automatiquementAvantages :
- Le code devient plus propre et plus court.
- Les ressources sont fermées dans le bon ordre (ordre inverse de leur création).
- Si une exception est levée à la fois dans le bloc try et lors de la fermeture, l'exception supprimée (suppressed) est ajoutée à l'exception principale.
Vous pouvez déclarer plusieurs ressources séparées par un point-virgule :
try (BufferedReader br = new BufferedReader(new FileReader("in.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) { // code} catch (IOException e) { System.err.println("Erreur : " + e.getMessage());}