Integrazione della gestione delle eccezioni
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 82 di 87.
Sfida
FacileRendiamo 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 chiamataLibraryExceptionche estendeException. 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 estendeLibraryException. 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 comeBook not available: [isbn].Library.java: aggiorna la tua classe Library affinché generi eccezioni invece di stampare messaggi di errore. Modifica il metodoborrowBook(String userId, String isbn)per:- Generare
LibraryExceptioncon il messaggioUser not found: [userId]se l'utente non esiste - Generare
LibraryExceptioncon il messaggioBook not found: [isbn]se il libro non esiste - Generare
BookNotAvailableExceptionse 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 LibraryExceptione cambia il tipo restituito inString.Lascia che tutti gli altri metodi (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) funzionino come prima.
- Generare
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:authorREGISTER_USER:id:nameBORROW:userId:isbn
Elabora ogni comando. Per ADD_BOOK, stampa
Added: [title]. Per REGISTER_USER, stampaRegistered: [name]. Per i comandi BORROW, usa un blocco try-catch per gestire le eccezioni; in caso di successo stampa il messaggio di conferma, per qualsiasiLibraryExceptionstampaError: [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 completedNota 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
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato10Gestione delle eccezioni in OOP
Gerarchia delle classi di eccezioneEccezioni personalizzateEccezioni controllate e non controllatePattern try-with-resourcesRiepilogo - Utente validato13Progetto: Gestione della biblioteca
Panoramica del progetto e progettazione UMLClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreIntegrazione della gestione delle eccezioniTest e integrazione2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online