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 gracieusement les conditions d'erreur : que se passe-t-il quand quelqu'un essaie d'emprunter un livre qui n'existe pas, ou quand un utilisateur tente d'emprunter plus de livres que permis ? Vous allez créer des exceptions personnalisées qui fournissent des retours significatifs pour ces scénarios.
Vous continuerez à construire sur votre code existant à travers six fichiers :
Book.java: Conservez votre classe Book avec toutes les fonctionnalités existantes — isbn, title, author, isAvailable, borrowedBy, getDetails(), et les getters/setters appropriés.User.java: Conservez votre classe User avec id, name, l'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 pour toutes les exceptions spécifiques à la bibliothèque. Incluez 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 lorsque quelqu'un essaie d'emprunter un livre qui est déjà emprunté. Incluez un constructeur qui accepte l'ISBN du livre et crée un message significatif commeBook not available: [isbn].Library.java: Mettez à jour votre classe Library pour lever des exceptions au lieu d'afficher des messages d'erreur. Modifiez la méthodeborrowBook(String userId, String isbn)pour :- 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 en sorte que l'utilisateur emprunte le livre et retourner le message de confirmation
[userName] borrowed [bookTitle]
Modifiez la signature de la méthode en
throws LibraryExceptionet changez le type de retour enString.Conservez toutes les autres méthodes (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) fonctionnant comme avant.
- 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 de ces formats :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 spécifiques. Le premier emprunt réussit, le deuxième échoue car le livre est déjà emprunté (BookNotAvailableException), et le troisième échoue car 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 la bibliothèque (Library) et le service d'administration (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: Afficher "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 Utilisateur2Modificateurs 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