Introduction à la gestion des erreurs en Java
Dans le monde de la programmation, les erreurs sont inévitables. Elles surviennent pour diverses raisons : saisie incorrecte de l'utilisateur, fichier inaccessible, erreurs dans la logique du programme ou pannes réseau. En langage Java, il existe un mécanisme puissant et flexible pour gérer ces situations : les exceptions. Une gestion correcte des erreurs n'est pas seulement une bonne pratique, c'est la clé de la stabilité, de la fiabilité et de la sécurité de votre application.
Dans cet article, nous allons détailler le fonctionnement de la gestion des erreurs en Java, en commençant par la structure de base try/catch et en terminant par des techniques avancées comme try-with-resources et la création d'exceptions personnalisées. Vous apprendrez la différence entre les exceptions vérifiées (checked) et non vérifiées (unchecked), et comment les utiliser correctement.
Les bases : la structure try/catch et finally
Bloc try et catch
Le cœur de la gestion des exceptions en Java est la structure try/catch. Le code qui peut lever une exception est placé dans le bloc try. Si une exception se produit dans ce bloc, l'exécution passe immédiatement au bloc catch correspondant, où cette exception est traitée.
public class Main { public static void main(String[] args) { try { int result = 10 / 0; // Cela provoquera une ArithmeticException System.out.println("Résultat : " + result); } catch (ArithmeticException e) { System.out.println("Erreur : division par zéro !"); e.printStackTrace(); // Affiche la pile d'appels pour le débogage } System.out.println("Le programme continue..."); }}Notez que la ligne System.out.println("Résultat : " + result); ne sera pas exécutée, car l'exception s'est produite plus tôt. Cependant, le programme ne "plante" pas — le contrôle passe au catch, et l'exécution se poursuit après le bloc try/catch.
Plusieurs blocs catch
Un seul bloc try peut avoir plusieurs blocs catch pour gérer différents types d'exceptions. Il est important de se rappeler que les exceptions plus spécifiques doivent être indiquées avant les exceptions plus générales.
try { String str = null; System.out.println(str.length()); // NullPointerException int[] arr = new int[5]; arr[10] = 100; // ArrayIndexOutOfBoundsException} catch (NullPointerException e) { System.out.println("NullPointerException : " + e.getMessage());} catch (ArrayIndexOutOfBoundsException e) { System.out.println("ArrayIndexOutOfBoundsException : " + e.getMessage());} catch (Exception e) { // Gestionnaire général pour toutes les autres exceptions System.out.println("Erreur générale : " + e.getMessage());}Bloc finally
Le bloc finally est un bloc spécial qui s'exécute toujours, qu'une exception ait été levée ou non. Il est idéal pour libérer des ressources : fermeture de fichiers, de connexions à une base de données ou de sockets.
import java.io.*;
public class FileExample { public static void main(String[] args) { FileInputStream file = null; try { file = new FileInputStream("test.txt"); int data = file.read(); System.out.println((char) data); } catch (FileNotFoundException e) { System.out.println("Fichier non trouvé !"); } catch (IOException e) { System.out.println("Erreur d'entrée-sortie !"); } finally { try { if (file != null) { file.close(); // Ferme le fichier dans tous les cas } } catch (IOException e) { System.out.println("Erreur lors de la fermeture du fichier !"); } } }}Même si une exception est levée dans le bloc try ou catch, le bloc finally sera exécuté.