Récapitulatif - Utilisateur validé
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 63 sur 87.
Défi
FacileConstruisons un système complet d'inscription d'utilisateurs qui valide les données d'entrée et utilise des exceptions personnalisées pour communiquer exactement ce qui n'a pas fonctionné ! Vous combinerez tout ce que vous avez appris dans ce chapitre : les exceptions contrôlées (checked) et non contrôlées (unchecked) personnalisées, la hiérarchie des exceptions, et le try-with-resources avec un validateur auto-closeable.
Vous organiserez votre code sur cinq fichiers :
ValidationException.java: Créez une exception contrôlée qui sert de base à toutes les erreurs de validation. Cette exception doit étendreExceptionet inclure un constructeur qui accepte un message.InvalidUsernameException.java: Créez une exception contrôlée pour les échecs de validation du nom d'utilisateur. Celle-ci doit étendre votre classeValidationException, créant ainsi une petite hiérarchie d'exceptions. Incluez un constructeur qui accepte un message et le transmet au parent.InvalidAgeException.java: Créez une exception non contrôlée pour les erreurs liées à l'âge (comme les âges négatifs, qui représentent des erreurs de programmation). Celle-ci doit étendreRuntimeExceptionavec un constructeur qui accepte un message.UserValidator.java: Créez une classe qui implémenteAutoCloseablepour simuler une session de validation qui doit être correctement fermée. Votre validateur doit :Afficher
Validator session starteddans le constructeur.Avoir une méthode
validateUsername(String username)qui lèveInvalidUsernameExceptionsi le nom d'utilisateur est nul, vide ou fait moins de 3 caractères (avec le message"Username must be at least 3 characters"). Sinon, affichezUsername '[username]' is valid.Avoir une méthode
validateAge(int age)qui lèveInvalidAgeExceptionsi l'âge est négatif (avec le message"Age cannot be negative: [age]"). Si l'âge est inférieur à 13, levezValidationExceptionavec le message"Must be at least 13 years old". Sinon, affichezAge [age] is valid.Implémenter
close()pour afficherValidator session closed.Main.java: Rassemblez votre système de validation ! Vous recevrez deux entrées : un nom d'utilisateur (String) et un âge (entier).Utilisez le try-with-resources pour créer un
UserValidator. À l'intérieur du bloc try, validez d'abord le nom d'utilisateur, puis validez l'âge. Si les deux réussissent, affichezUser registration successful!Capturez
InvalidUsernameExceptionet affichezUsername error: [message]. CapturezInvalidAgeExceptionet affichezAge error: [message]. CapturezValidationException(le parent) et affichezValidation error: [message].Le validateur doit se fermer automatiquement, que la validation réussisse ou échoue !
Vous recevrez deux entrées dans l'ordre : le nom d'utilisateur (String) et l'âge (entier).
Ce défi rassemble tout le chapitre : vous construirez une hiérarchie d'exceptions avec ValidationException comme parent, utiliserez de manière appropriée les exceptions contrôlées et non contrôlées, et garantirez que votre ressource de validation est toujours nettoyée avec try-with-resources. Remarquez comment la capture de l'exception parente ValidationException après son enfant InvalidUsernameException vous permet de gérer d'abord les cas spécifiques tout en capturant les autres erreurs de validation !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les entrées
String username = scanner.nextLine();
int age = scanner.nextInt();
// TODO: Utiliser try-with-resources pour créer un UserValidator
// À l'intérieur du bloc try :
// 1. Valider le username
// 2. Valider l'age
// 3. Si les deux réussissent, afficher "User registration successful!"
// TODO: Intercepter InvalidUsernameException et afficher "Username error: [message]"
// TODO: Intercepter InvalidAgeException et afficher "Age error: [message]"
// TODO: Intercepter ValidationException (parent) et afficher "Validation error: [message]"
// Note: Le validateur doit se fermer automatiquement, quel que soit le succès ou l'échec !
}
}
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érateur