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 é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ée LibraryException qui étend Exception. 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 étend LibraryException. 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 que Book 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éthode borrowBook(String userId, String isbn) afin de :
    • 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 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 LibraryException et changez son type de retour en String.

    Conservez le fonctionnement de toutes les autres méthodes (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) comme auparavant.

  • 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: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 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

Entraînez-vous par vous-même : Compilateur Java en ligne