Menu
Coddy logo textTech

Integration von Exception Handling

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 82 von 87.

challenge icon

Aufgabe

Einfach

Lassen Sie uns Ihr Bibliotheksverwaltungssystem robuster machen, indem wir eine ordnungsgemäße Ausnahmebehandlung integrieren! Ein reales Bibliothekssystem muss Fehlerzustände elegant handhaben – was passiert, wenn jemand versucht, ein Buch auszuleihen, das nicht existiert, oder wenn ein Benutzer versucht, mehr Bücher auszuleihen als erlaubt? Sie werden benutzerdefinierte Ausnahmen erstellen, die für diese Szenarien aussagekräftiges Feedback geben.

Sie werden auf Ihrem bestehenden Code in sechs Dateien weiter aufbauen:

  • Book.java: Behalten Sie Ihre Book-Klasse mit allen vorhandenen Funktionen bei – isbn, title, author, isAvailable, borrowedBy, getDetails() und die entsprechenden Getter/Setter.
  • User.java: Behalten Sie Ihre User-Klasse mit id, name, der borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() und toString() bei.
  • LibraryException.java: Erstellen Sie eine benutzerdefinierte Basis-Ausnahmeklasse namens LibraryException, die Exception erweitert. Dies wird die Elternklasse für alle bibliotheksspezifischen Ausnahmen sein. Fügen Sie einen Konstruktor hinzu, der eine Nachricht akzeptiert und diese an die Elternklasse weitergibt.
  • BookNotAvailableException.java: Erstellen Sie eine benutzerdefinierte Ausnahme, die LibraryException erweitert. Diese Ausnahme sollte ausgelöst werden, wenn jemand versucht, ein Buch auszuleihen, das bereits ausgeliehen ist. Fügen Sie einen Konstruktor hinzu, der die ISBN des Buches akzeptiert und eine aussagekräftige Nachricht wie Book not available: [isbn] erstellt.
  • Library.java: Aktualisieren Sie Ihre Library-Klasse, um Ausnahmen auszulösen, anstatt Fehlermeldungen auszugeben. Ändern Sie die Methode borrowBook(String userId, String isbn) so, dass sie:
    • Eine LibraryException mit der Nachricht User not found: [userId] auslöst, wenn der Benutzer nicht existiert
    • Eine LibraryException mit der Nachricht Book not found: [isbn] auslöst, wenn das Buch nicht existiert
    • Eine BookNotAvailableException auslöst, wenn das Buch bereits ausgeliehen ist
    • Bei Erfolg den Benutzer das Buch ausleihen lässt und die Bestätigungsmeldung [userName] borrowed [bookTitle] zurückgibt

    Ändern Sie die Methodensignatur in throws LibraryException und ändern Sie den Rückgabetyp in String.

    Behalten Sie alle anderen Methoden (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) wie bisher bei.

  • Main.java: Demonstrieren Sie Ihre Ausnahmebehandlung! Sie erhalten eine kommagetrennte Zeichenfolge von Befehlen. Jeder Befehl folgt einem dieser Formate:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Verarbeiten Sie jeden Befehl. Geben Sie für ADD_BOOK Added: [title] aus. Geben Sie für REGISTER_USER Registered: [name] aus. Verwenden Sie für BORROW-Befehle einen try-catch-Block, um Ausnahmen zu behandeln – geben Sie bei Erfolg die Bestätigungsmeldung aus, geben Sie bei jeder LibraryException Error: [exception message] aus.

    Geben Sie nach der Verarbeitung aller Befehle Operations completed aus.

Sie erhalten eine Eingabe: eine kommagetrennte Zeichenfolge von Befehlen.

Zum Beispiel würde bei der Eingabe ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001 Ihre Ausgabe wie folgt aussehen:

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

Beachten Sie, wie die benutzerdefinierten Ausnahmen klare, spezifische Fehlermeldungen liefern. Die erste Ausleihe ist erfolgreich, die zweite schlägt fehl, weil das Buch bereits ausgeliehen ist (BookNotAvailableException), und die dritte schlägt fehl, weil der Benutzer U002 nicht existiert (LibraryException). Dieser Ansatz macht Ihr Bibliothekssystem viel informativer und einfacher zu debuggen als generische Fehlermeldungen!

Probier es selbst

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

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lies die durch Kommas getrennten Befehle ein
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Erstelle Library und AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Verarbeite jeden Befehl
        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: Verwende einen try-catch-Block, um library.borrowBook(userId, isbn) aufzurufen
                // Bei Erfolg die zurückgegebene Bestätigungsnachricht ausgeben
                // Bei LibraryException "Error: " + e.getMessage() ausgeben
            }
        }
        
        // TODO: "Operations completed" ausgeben
    }
}

Alle Lektionen in Objektorientierte Programmierung