Intégration de la gestion des exceptions
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 82 sur 87.
Défi
FacileRendons votre système de gestion de bibliothèque plus robuste en intégrant une gestion appropriée des exceptions ! Un véritable système de bibliothèque doit gérer élégamment les situations d’erreur : que se passe-t-il lorsqu’une personne tente d’emprunter un livre qui n’existe pas, ou lorsqu’un utilisateur essaie d’emprunter plus de livres que la limite autorisée ? Vous allez créer des exceptions personnalisées qui fourniront des informations utiles pour ces situations.
Vous allez continuer à développer votre code existant réparti sur six fichiers :
Book.java: conservez votre classe Book avec toutes ses fonctionnalités existantes : isbn, title, author, isAvailable, borrowedBy, getDetails(), ainsi que les getters/setters appropriés.User.java: conservez votre classe User avec id, name, le ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() et toString().LibraryException.java: créez une classe d’exception personnalisée de base appeléeLibraryExceptionqui étendException. Ce sera la classe parente de toutes les exceptions spécifiques à la bibliothèque. Ajoutez un constructeur qui accepte un message et le transmet à la classe parente.BookNotAvailableException.java: créez une exception personnalisée qui étendLibraryException. Cette exception doit être levée lorsqu’une personne tente d’emprunter un livre qui est déjà emprunté. Ajoutez un constructeur qui accepte l’ISBN du livre et crée un message explicite tel queBook not available: [isbn].Library.java: mettez à jour votre classe Library afin qu’elle lève des exceptions au lieu d’afficher des messages d’erreur. Modifiez la méthodeborrowBook(String userId, String isbn)afin de :- lever
LibraryExceptionavec le messageUser not found: [userId]si l’utilisateur n’existe pas - lever
LibraryExceptionavec le messageBook not found: [isbn]si le livre n’existe pas - lever
BookNotAvailableExceptionsi le livre est déjà emprunté - en cas de succès, faire emprunter le livre à l’utilisateur et renvoyer le message de confirmation
[userName] borrowed [bookTitle]
Modifiez la signature de la méthode afin d’ajouter
throws LibraryExceptionet changez son type de retour enString.Conservez le fonctionnement de toutes les autres méthodes (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) comme auparavant.
- lever
Main.java: démontrez votre gestion des exceptions ! Vous recevrez une chaîne de commandes séparées par des virgules. Chaque commande suit l’un des formats suivants :ADD_BOOK:isbn:title:authorREGISTER_USER:id:nameBORROW:userId:isbn
Traitez chaque commande. Pour ADD_BOOK, affichez
Added: [title]. Pour REGISTER_USER, affichezRegistered: [name]. Pour les commandes BORROW, utilisez un bloc try-catch pour gérer les exceptions : en cas de succès, affichez le message de confirmation ; pour touteLibraryException, affichezError: [exception message].Après avoir traité toutes les commandes, affichez
Operations completed.
Vous recevrez une entrée : une chaîne de commandes séparées par des virgules.
Par exemple, avec l’entrée ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001, votre sortie serait :
Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completedRemarquez comment les exceptions personnalisées fournissent des messages d’erreur clairs et précis. Le premier emprunt réussit, le deuxième échoue parce que le livre est déjà emprunté (BookNotAvailableException), et le troisième échoue parce que l’utilisateur U002 n’existe pas (LibraryException). Cette approche rend votre système de bibliothèque beaucoup plus informatif et plus facile à déboguer que des messages d’erreur génériques !
Essayez vous-même
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les commandes séparées par des virgules
String input = scanner.nextLine();
String[] commands = input.split(",");
// Créer Library et AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Traiter chaque commande
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
// TODO: Utiliser un bloc try-catch pour appeler library.borrowBook(userId, isbn)
// En cas de succès, afficher le message de confirmation retourné
// En cas de LibraryException, afficher "Error: " + e.getMessage()
}
}
// TODO: Print "Operations completed"
}
}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é13Projet : Gestion de bibliothèque
Présentation du projet et conception UMLClasses Livre et UtilisateurSystème d'empruntFonctionnalité de rechercheInterface administrateurIntégration de la gestion des exceptionsTests et intégration2Modificateurs 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