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

Verbessern wir dein Library Management System, indem wir eine geeignete Ausnahmebehandlung integrieren! Ein echtes Bibliothekssystem muss Fehlerbedingungen elegant behandeln: Was passiert, wenn jemand versucht, ein Buch auszuleihen, das nicht existiert, oder wenn ein Benutzer versucht, mehr Bücher auszuleihen als erlaubt? Du wirst benutzerdefinierte Ausnahmen erstellen, die für diese Szenarien aussagekräftiges Feedback liefern.

Du wirst deinen bestehenden Code über sechs Dateien hinweg weiter ausbauen:

  • Book.java: Behalte deine Book-Klasse mit allen vorhandenen Funktionen bei: isbn, title, author, isAvailable, borrowedBy, getDetails() sowie die passenden Getter/Setter.
  • User.java: Behalte deine User-Klasse mit id, name, der borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() und toString() bei.
  • LibraryException.java: Erstelle eine benutzerdefinierte Basisausnahmeklasse namens LibraryException, die Exception erweitert. Sie wird die Elternklasse für alle bibliotheksspezifischen Ausnahmen sein. Füge einen Constructor hinzu, der eine Nachricht akzeptiert und sie an die Elternklasse weitergibt.
  • BookNotAvailableException.java: Erstelle eine benutzerdefinierte Ausnahme, die LibraryException erweitert. Diese Ausnahme soll ausgelöst werden, wenn jemand versucht, ein bereits ausgeliehenes Buch auszuleihen. Füge einen Constructor hinzu, der die ISBN des Buches akzeptiert und eine aussagekräftige Nachricht wie Book not available: [isbn] erstellt.
  • Library.java: Aktualisiere deine Library-Klasse so, dass sie Ausnahmen auslöst, anstatt Fehlermeldungen auszugeben. Ändere die borrowBook(String userId, String isbn)-Methode wie folgt:
    • Löse LibraryException mit der Nachricht User not found: [userId] aus, wenn der Benutzer nicht existiert.
    • Löse LibraryException mit der Nachricht Book not found: [isbn] aus, wenn das Buch nicht existiert.
    • Löse BookNotAvailableException aus, wenn das Buch bereits ausgeliehen ist.
    • Bei Erfolg soll der Benutzer das Buch ausleihen und die Bestätigungsnachricht [userName] borrowed [bookTitle] zurückgegeben werden.

    Ändere die Methodensignatur in throws LibraryException und den Rückgabetyp in String.

    Alle anderen Methoden (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) sollen wie bisher funktionieren.

  • Main.java: Zeige deine Ausnahmebehandlung! Du erhältst eine durch Kommas getrennte Zeichenkette von Befehlen. Jeder Befehl folgt einem dieser Formate:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Verarbeite jeden Befehl. Gib für ADD_BOOK Added: [title] aus. Gib für REGISTER_USER Registered: [name] aus. Verwende für BORROW-Befehle einen try-catch-Block zur Behandlung von Ausnahmen: Gib bei Erfolg die Bestätigungsnachricht aus und bei jeder LibraryException Error: [exception message].

    Gib nach der Verarbeitung aller Befehle Operations completed aus.

Du erhältst eine Eingabe: eine durch Kommas getrennte Zeichenkette von Befehlen.

Beispielsweise würde deine Ausgabe 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 folgendermaßen aussehen:

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

Beachte, wie die benutzerdefinierten Ausnahmen klare, spezifische Fehlermeldungen liefern. Das erste Ausleihen ist erfolgreich, das zweite schlägt fehl, weil das Buch bereits ausgeliehen ist (BookNotAvailableException), und das dritte schlägt fehl, weil der Benutzer U002 nicht existiert (LibraryException). Dieser Ansatz macht dein Bibliothekssystem wesentlich informativer und leichter zu debuggen als allgemeine 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);
        
        // Die durch Kommas getrennten Befehle lesen
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Library und AdminService erstellen
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Jeden Befehl verarbeiten
        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: Print "Operations completed"
    }
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler