Erreurs Checked vs Unchecked
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 61 sur 87.
Vous avez vu que la hiérarchie des exceptions de Java se divise en différentes branches. La distinction essentielle que vous devez comprendre est celle entre les exceptions vérifiées et non vérifiées. Cela influe sur la manière dont vous devez les gérer dans votre code.
Les exceptions vérifiées sont des exceptions que le compilateur vous oblige à gérer. Elles étendent directement Exception (et non par l’intermédiaire de RuntimeException). Vous devez soit les intercepter, soit les déclarer avec throws :
// Doit gérer IOException - c'est une exception vérifiée
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path); // Peut lancer IOException
}
// Ou l'attraper
public void readFileSafe(String path) {
try {
FileReader reader = new FileReader(path);
} catch (IOException e) {
System.out.println("File error: " + e.getMessage());
}
}Les exceptions non vérifiées étendent RuntimeException. Le compilateur n’exige pas que vous les traitiez. Elles indiquent généralement des erreurs de programmation telles que des références nulles ou un accès à un tableau non valide :
// Aucune déclaration throws nécessaire
public int divide(int a, int b) {
return a / b; // Peut lever ArithmeticException (non vérifiée)
}
String name = null;
name.length(); // NullPointerException (non vérifiée)Lorsque vous créez des exceptions personnalisées, choisissez la classe parente en fonction de la manière dont vous souhaitez que les appelants les gèrent. Utilisez des exceptions vérifiées pour les situations récupérables auxquelles l’appelant doit s’attendre. Utilisez des exceptions non vérifiées pour les erreurs de programmation qui ne devraient pas se produire dans un code correct.
Défi
FacileConstruisons un système de vérification d’âge qui illustre la différence essentielle entre les exceptions vérifiées et non vérifiées ! Vous allez créer des exceptions personnalisées des deux types et voir comment le compilateur les traite différemment.
Vous organiserez votre code sur quatre fichiers :
InvalidAgeException.java: créez une exception vérifiée pour les échecs de validation de l’âge. Cette exception doit étendre directementException, ce qui signifie que les appelants seront obligés de la gérer. Incluez un constructeur qui accepte un message et le transmet à la classe parente.NegativeAgeException.java: créez une exception non vérifiée lorsqu’une personne fournit un âge négatif (une erreur de programmation qui ne devrait pas se produire avec une entrée correcte). Elle doit étendreRuntimeException. Incluez un constructeur qui accepte un message et le transmet à la classe parente.AgeVerifier.java: créez une classe qui valide les âges à l’aide des deux types d’exceptions. Incluez deux méthodes statiques :verifyAge(int age)- Cette méthode doit leverNegativeAgeException(non vérifiée) avec le message"Age cannot be negative: [age]"si l’âge est inférieur à 0. Si l’âge est inférieur à 18, levezInvalidAgeException(vérifiée) avec le message"Must be 18 or older: [age]". Sinon, affichezAge [age] verified successfully. Puisque cette méthode lève une exception vérifiée, vous devez la déclarer avecthrows InvalidAgeException.verifyAgeUncheckedOnly(int age)- Cette méthode utilise uniquement des exceptions non vérifiées. Si l’âge est négatif, levezNegativeAgeExceptionavec le même format de message. Si l’âge est inférieur à 18, levez uneIllegalArgumentExceptionavec le message"Too young: [age]". Sinon, affichezAge [age] verified (unchecked method). Remarquez que cette méthode n’a besoin d’aucune déclarationthrows!Main.java: réunissez votre système de vérification ! Vous recevrez une entrée : un âge (entier).Commencez par afficher
=== Checked Exception Method ===et appelezverifyAgeavec l’âge fourni. Puisqu’elle lève une exception vérifiée, vous devez l’encapsuler dans un bloc try-catch. InterceptezInvalidAgeExceptionet affichezChecked exception caught: [message]. Interceptez égalementNegativeAgeExceptionet affichezUnchecked exception caught: [message].Affichez ensuite une ligne vide et
=== Unchecked Exception Method ===. AppelezverifyAgeUncheckedOnlyavec le même âge. Même si cette méthode peut lever des exceptions, vous n’êtes pas obligé de les intercepter. Cependant, encapsulez-la tout de même dans un bloc try-catch afin de gérer les erreurs correctement. InterceptezNegativeAgeExceptionet affichezRuntime exception caught: [message]. InterceptezIllegalArgumentExceptionet affichezIllegal argument caught: [message].
Vous recevrez une entrée : un entier représentant l’âge à vérifier.
Remarquez la différence essentielle : la méthode avec l’exception vérifiée exige une déclaration throws et oblige les appelants à la gérer, tandis que la méthode avec l’exception non vérifiée se compile correctement sans aucune gestion d’exception. C’est la distinction fondamentale entre les exceptions vérifiées et non vérifiées en Java !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
// TODO: Test the checked exception method
// Print: "=== Checked Exception Method ==="
// Appelez AgeVerifier.verifyAge(age) dans un try-catch
// - Catch InvalidAgeException: print "Checked exception caught: [message]"
// - Catch NegativeAgeException: print "Unchecked exception caught: [message]"
// TODO: Print a blank line, then "=== Unchecked Exception Method ==="
// Appelez AgeVerifier.verifyAgeUncheckedOnly(age) dans un try-catch
// - Catch NegativeAgeException: print "Runtime exception caught: [message]"
// - Catch IllegalArgumentException: print "Illegal argument caught: [message]"
}
}
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