Hiérarchie des classes d'exception
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 59 sur 87.
Le système de gestion des exceptions de Java repose sur une hiérarchie de classes bien organisée, dont la racine est la classe Throwable. Comprendre cette hiérarchie vous aide à intercepter et à gérer les exceptions plus efficacement.
Au sommet se trouve Throwable, le parent de toutes les exceptions et erreurs. Il possède deux sous-classes directes :
Throwable
├── Error // Problèmes graves (ne les attrapez pas)
└── Exception // Problèmes récupérables
└── RuntimeException // Exceptions non vérifiéesUne erreur représente des problèmes graves que les applications ne devraient pas essayer de gérer, comme OutOfMemoryError ou StackOverflowError. Ceux-ci indiquent des problèmes fondamentaux avec la JVM elle-même.
Exception est la branche avec laquelle tu travailleras le plus. Elle se divise en deux catégories : les exceptions contrôlées (sous-classes directes de Exception) et les exceptions non contrôlées (sous-classes de RuntimeException).
// Classes d'exception courantes
Exception
├── IOException // Problèmes de fichier/réseau
├── SQLException // Problèmes de base de données
└── RuntimeException
├── NullPointerException
├── ArrayIndexOutOfBoundsException
└── IllegalArgumentExceptionPuisque les exceptions sont des classes, elles suivent les règles d’héritage. Lorsque vous appliquez catch à un type d’exception parent, vous interceptez également tous ses enfants :
try {
// du code
} catch (Exception e) {
// Capture TOUTES les exceptions (trop large en général)
}try {
// du code
} catch (RuntimeException e) {
// Catches only runtime exceptions and subclasses
}Cette hiérarchie vous permet d’être aussi précis ou général que nécessaire lors de la gestion des erreurs, et elle constitue la base de la création de vos propres exceptions personnalisées.
Défi
FacileConstruisons un analyseur d’exceptions qui montre concrètement comment fonctionne la hiérarchie des exceptions de Java ! Vous allez créer un système qui intercepte les exceptions à différents niveaux de spécificité et indique quel type a été intercepté.
Vous allez organiser votre code dans trois fichiers :
ExceptionThrower.java: créez une classe capable de déclencher différents types d’exceptions selon l’entrée. Votre classe doit comporter trois méthodes statiques :triggerRuntime(String type)- Selon la chaîne de caractères type, déclenchez différentes exceptions d’exécution :- Si type vaut
"null", déclenchez uneNullPointerExceptionavec le message"Null value encountered" - Si type vaut
"index", déclenchez uneArrayIndexOutOfBoundsExceptionavec le message"Invalid index" - Si type vaut
"argument", déclenchez uneIllegalArgumentExceptionavec le message"Bad argument"
triggerArithmetic()- Déclenchez uneArithmeticExceptionavec le message"Division error"triggerGeneric()- Déclenchez uneIllegalStateExceptionavec le message"Generic runtime error"(sa hiérarchie est Exception > RuntimeException > IllegalStateException)- Si type vaut
ExceptionAnalyzer.java: créez une classe qui intercepte les exceptions à différents niveaux de la hiérarchie et identifie ce qui a été intercepté. Incluez ces méthodes statiques :analyzeSpecific(String type)- AppelezExceptionThrower.triggerRuntime(type)dans un bloc try. Utilisez des blocs catch distincts pourNullPointerException,ArrayIndexOutOfBoundsExceptionetIllegalArgumentException. Pour chacun, affichez :Caught specific: [exception class simple name], suivi deMessage: [exception message]analyzeWithParent()- AppelezExceptionThrower.triggerArithmetic()dans un bloc try. Interceptez-la avecRuntimeException(le type parent). Affichez :Caught via parent: RuntimeException, suivi deActual type: [exception class simple name]analyzeWithGrandparent()- AppelezExceptionThrower.triggerGeneric()dans un bloc try. Interceptez-la avecException(encore plus haut dans la hiérarchie). Affichez :Caught via grandparent: Exception, suivi deActual type: [exception class simple name]Main.java: assemblez votre analyseur d’exceptions ! Vous recevrez une entrée : une chaîne indiquant le type d’exception (soit"null","index"ou"argument").Commencez par afficher
=== Specific Catch ===et appelezanalyzeSpecificavec votre entrée.Affichez ensuite une ligne vide,
=== Parent Catch ===, puis appelezanalyzeWithParent.Enfin, affichez une ligne vide,
=== Grandparent Catch ===, puis appelezanalyzeWithGrandparent.
Vous recevrez une entrée : le type d’exception à déclencher ("null", "index" ou "argument").
Utilisez e.getClass().getSimpleName() pour obtenir le nom de classe de l’exception et e.getMessage() pour récupérer son message. Ce défi montre qu’intercepter un type d’exception parent intercepte également tous ses types enfants : un concept essentiel pour déterminer le niveau de spécificité de la gestion de vos exceptions !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String type = scanner.nextLine();
// TODO: Print "=== Specific Catch ===" and call ExceptionAnalyzer.analyzeSpecific(type)
// TODO: Affiche une ligne vide, puis "=== Parent Catch ===", puis appelle ExceptionAnalyzer.analyzeWithParent()
// TODO: Print a blank line, then "=== Grandparent Catch ===", then call ExceptionAnalyzer.analyzeWithGrandparent()
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne