Erreurs en Java

Introduction aux erreurs en Java

Dans le monde de la programmation en Java, il est courant de rencontrer des situations où des imprévus peuvent perturber l'exécution d'un programme. Ces situations sont principalement gérées par deux sous-classes de la classe java.lang.Throwable : Error et Exception.

Les Erreurs (Errors)

La classe Error représente des opérations illégales qui engendrent des anomalies graves dans le programme et il est généralement déconseillé de les intercepter. Voici quelques exemples d'erreurs :

  • La ClassFormatError, qui se produit lorsqu'un fichier de classe ne peut pas être lu ou interprété.
  • La IncompatibleClassChangeError, qui intervient lorsqu'une classe de base est modifiée après l'initialisation d'une classe enfant.
  • La NoClassDefFoundError, qui survient lorsque le fichier contenant la méthode main() ne peut être trouvé.

Les Exceptions

La classe Exception, quant à elle, désigne des événements anormaux et inattendus qui perturbent le flux d'exécution d'un programme, mais qui peuvent être raisonnablement gérés à l'aide de blocs catch. Voici quelques exemples d'exceptions courantes :

  • ArrayIndexOutOfBoundsException, qui se déclenche lors de l'accès à un index qui n'existe pas dans un tableau.
  • FileNotFoundException, qui se produit lorsqu'un fichier avec le chemin spécifié est introuvable.
  • NumberFormatException, qui est levée lorsqu'on essaie de convertir une chaîne en type numérique, mais que la chaîne contient des caractères non numériques.
  • NullPointerException, qui se produit lorsqu'on tente d'utiliser une valeur nulle à la place d'un objet.

Exemple d'utilisation

Pour gérer ces anomalies, les programmeurs utilisent souvent un bloc try...catch, qui permet d'encapsuler une section de code et de « capturer » une Exception potentiellement lancée (mais jamais une Error) avant que l'exécution du programme ne soit interrompue.

Voici un exemple :

class DivideByZero {
  public static void main(String[] args) {
    int a = 27, b = 0;
    try {
      System.out.println("Je suis exécuté en premier !");
      int c = a / b; // Cela générera une exception
      System.out.println("Je ne suis jamais exécuté !");
    } catch (ArithmeticException e) {
      System.out.println("Exception attrapée !");
      e.printStackTrace();
    }
    System.out.println("Fini !");
  }
}

Dans ce morceau de code, l'opération de division par zéro est interceptée, et un message d'erreur est affiché.

Gérer plusieurs exceptions

Lorsqu'il s'agit de traiter différents types d'exceptions, il existe deux méthodes courantes :

// Gérer les erreurs séparément
try {
  // code...
} catch (Exception1 e) {
  // code pour Exception1
} catch (Exception2 e) {
  // code pour Exception2
}

// Gérer les erreurs de la même manière
try {
  // code...
} catch (Exception1 | Exception2 e) {
  // code commun pour Exception1 et Exception2
}