Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Rendons 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ée LibraryException qui étend Exception. 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 étend LibraryException. 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 comme Book 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éthode borrowBook(String userId, String isbn) pour :
    • Lever LibraryException avec le message User not found: [userId] si l'utilisateur n'existe pas
    • Lever LibraryException avec le message Book not found: [isbn] si le livre n'existe pas
    • Lever BookNotAvailableException si 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 LibraryException et changez le type de retour en String.

    Conservez toutes les autres méthodes (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) fonctionnant comme avant.

  • 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:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Traitez chaque commande. Pour ADD_BOOK, affichez Added: [title]. Pour REGISTER_USER, affichez Registered: [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 toute LibraryException, affichez Error: [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 completed

Remarquez 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