1. Découverte des exceptions
Commençons par une analogie simple. Imaginez que votre programme est une voiture qui roule sur la route. Tout va bien jusqu’à ce qu’il se passe quelque chose d’inattendu : un pneu crève, l’essence est vide, le moteur surchauffe. Si l’on ne « traite » pas cette situation (par exemple, en mettant la roue de secours ou en faisant le plein), la voiture s’arrête et ne repart pas. De même dans un programme : si l’on ne traite pas une exception, le programme se termine de manière anormale.
Exception (exception) — c’est un objet créé au moment où un problème survient pendant l’exécution du programme. L’exception signale : « Stop ! Quelque chose s’est mal passé ! »
Exemples de situations où des exceptions surviennent :
- Division par zéro (10 / 0)
- Tentative d’accéder à un élément de tableau inexistant (arr[999])
- Ouverture d’un fichier qui n’existe pas sur le disque
- Conversion de la chaîne "abc" en nombre (Integer.parseInt("abc"))
Important : les exceptions ne sont pas des erreurs de compilation (par exemple, des fautes de frappe dans le code), mais des problèmes qui apparaissent pendant l’exécution du programme.
Pourquoi les exceptions sont-elles utiles ?
- Code clair : la logique principale du programme n’est pas encombrée de vérifications constantes pour chaque détail.
- Flexibilité : il est possible de gérer les erreurs de manière centralisée (par exemple, toutes les erreurs de lecture de fichiers en un seul endroit).
- Fiabilité : le programme ne « plante » pas avec un message mystérieux, il indique ce qui s’est passé.
2. Exceptions (Exceptions) vs Erreurs (Errors)
En Java, il existe deux types principaux de problèmes susceptibles de survenir pendant l’exécution du programme :
Erreurs (Errors)
Les erreurs sont des problèmes fatals et irrécupérables dus à des défaillances de la machine virtuelle Java (JVM) elle-même. Elles sont généralement liées aux ressources de l’ordinateur ou à des pannes internes de la JVM.
Exemples d’erreurs :
- OutOfMemoryError — la mémoire est épuisée.
- StackOverflowError — débordement de pile (par exemple, à cause d’une récursion infinie).
Important : il ne faut généralement pas tenter de gérer de telles erreurs dans le programme.
Exceptions (Exceptions)
Les exceptions sont des problèmes que le programme peut (et doit) gérer. Elles surviennent à cause d’erreurs de logique du programme ou de facteurs externes (par exemple, l’utilisateur a saisi autre chose que ce qui était attendu).
Exemples d’exceptions :
- NullPointerException — tentative d’utiliser null comme un objet.
- ArrayIndexOutOfBoundsException — dépassement des limites d’un tableau.
- IOException — erreur lors du travail avec des fichiers.
En Java, il existe deux types d’exceptions :
- Checked exceptions (vérifiées) — le compilateur exige qu’elles soient gérées (par exemple, IOException).
- Unchecked exceptions (non vérifiées) — le compilateur n’exige pas leur gestion (par exemple, NullPointerException).
Schéma : où se trouve quoi
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(autres Exceptions)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
Explication :
- Throwable — la racine de toute l’architecture des erreurs et des exceptions en Java.
- Error — erreurs fatales de la JVM, non gérées.
- Exception — exceptions « normales » qu’il faut et qu’on peut gérer.
- RuntimeException — exceptions non vérifiées (erreurs du développeur).
3. À quoi cela ressemble-t-il dans le code ?
Exemple 1 : Division par zéro
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // Une ArithmeticException se produira ici !
System.out.println("Résultat: " + c);
}
}
Que va-t-il se passer ?
Le programme se terminera par une erreur et vous verrez le message :
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Exemple 2 : Accès à un élément de tableau inexistant
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Exemple 3 : Manipulation de fichiers
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
Voyons maintenant comment gérer proprement de telles situations exceptionnelles.
GO TO FULL VERSION