Menu
Coddy logo textTech

Integrazione della gestione delle eccezioni

Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 82 di 87.

challenge icon

Sfida

Facile

Rendiamo più robusto il tuo sistema di gestione della biblioteca integrando una corretta gestione delle eccezioni! Un vero sistema bibliotecario deve gestire con eleganza le situazioni di errore: cosa succede quando qualcuno cerca di prendere in prestito un libro che non esiste o quando un utente tenta di prendere in prestito più libri di quanti ne siano consentiti? Creerai eccezioni personalizzate che forniscono un feedback significativo per questi scenari.

Continuerai a lavorare sul codice esistente in sei file:

  • Book.java: mantieni la tua classe Book con tutte le funzionalità esistenti: isbn, title, author, isAvailable, borrowedBy, getDetails() e i getter/setter appropriati.
  • User.java: mantieni la tua classe User con id, name, l'ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().
  • LibraryException.java: crea una classe di eccezione personalizzata di base chiamata LibraryException che estende Exception. Sarà la classe genitore di tutte le eccezioni specifiche della biblioteca. Includi un costruttore che accetta un messaggio e lo passa alla classe genitore.
  • BookNotAvailableException.java: crea un'eccezione personalizzata che estende LibraryException. Questa eccezione dovrebbe essere generata quando qualcuno cerca di prendere in prestito un libro che è già in prestito. Includi un costruttore che accetta l'ISBN del libro e crea un messaggio significativo come Book not available: [isbn].
  • Library.java: aggiorna la tua classe Library affinché generi eccezioni invece di stampare messaggi di errore. Modifica il metodo borrowBook(String userId, String isbn) per:
    • Generare LibraryException con il messaggio User not found: [userId] se l'utente non esiste
    • Generare LibraryException con il messaggio Book not found: [isbn] se il libro non esiste
    • Generare BookNotAvailableException se il libro è già in prestito
    • In caso di successo, far prendere in prestito il libro all'utente e restituire il messaggio di conferma [userName] borrowed [bookTitle]

    Modifica la firma del metodo in throws LibraryException e cambia il tipo restituito in String.

    Lascia che tutti gli altri metodi (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) funzionino come prima.

  • Main.java: mostra la gestione delle eccezioni! Riceverai una stringa di comandi separati da virgole. Ogni comando segue uno di questi formati:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Elabora ogni comando. Per ADD_BOOK, stampa Added: [title]. Per REGISTER_USER, stampa Registered: [name]. Per i comandi BORROW, usa un blocco try-catch per gestire le eccezioni; in caso di successo stampa il messaggio di conferma, per qualsiasi LibraryException stampa Error: [exception message].

    Dopo aver elaborato tutti i comandi, stampa Operations completed.

Riceverai un input: una stringa di comandi separati da virgole.

Ad esempio, con l'input ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001, il tuo output sarà:

Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completed

Nota come le eccezioni personalizzate forniscano messaggi di errore chiari e specifici. Il primo prestito riesce, il secondo non riesce perché il libro è già in prestito (BookNotAvailableException) e il terzo non riesce perché l'utente U002 non esiste (LibraryException). Questo approccio rende il tuo sistema bibliotecario molto più informativo e più facile da correggere rispetto ai messaggi di errore generici!

Provalo tu

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leggi i comandi separati da virgole
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Crea Library e AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Elabora ogni comando
        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: Usa un blocco try-catch per chiamare library.borrowBook(userId, isbn)
                // In caso di successo, stampa il messaggio di conferma restituito
                // In caso di LibraryException, stampa "Error: " + e.getMessage()
            }
        }
        
        // TODO: Stampa "Operations completed"
    }
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Java online