Integration von Exception Handling
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 82 von 87.
Aufgabe
EinfachLassen 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 namensLibraryException, dieExceptionerweitert. 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, dieLibraryExceptionerweitert. 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 wieBook not available: [isbn]erstellt.Library.java: Aktualisieren Sie Ihre Library-Klasse, um Ausnahmen auszulösen, anstatt Fehlermeldungen auszugeben. Ändern Sie die MethodeborrowBook(String userId, String isbn)so, dass sie:- Eine
LibraryExceptionmit der NachrichtUser not found: [userId]auslöst, wenn der Benutzer nicht existiert - Eine
LibraryExceptionmit der NachrichtBook not found: [isbn]auslöst, wenn das Buch nicht existiert - Eine
BookNotAvailableExceptionauslö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 LibraryExceptionund ändern Sie den Rückgabetyp inString.Behalten Sie alle anderen Methoden (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) wie bisher bei.
- Eine
Main.java: Demonstrieren Sie Ihre Ausnahmebehandlung! Sie erhalten eine kommagetrennte Zeichenfolge von Befehlen. Jeder Befehl folgt einem dieser Formate:ADD_BOOK:isbn:title:authorREGISTER_USER:id:nameBORROW:userId:isbn
Verarbeiten Sie jeden Befehl. Geben Sie für ADD_BOOK
Added: [title]aus. Geben Sie für REGISTER_USERRegistered: [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 jederLibraryExceptionError: [exception message]aus.Geben Sie nach der Verarbeitung aller Befehle
Operations completedaus.
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 completedBeachten 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
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren10Ausnahmebehandlung in OOP
Exception-KlassenhierarchieBenutzerdefinierte ExceptionsChecked vs. Unchecked ErrorsTry-With-Resources-PatternRecap – Validierter Benutzer13Projekt: Bibliotheksverwaltung
Projektübersicht & UML-DesignBuch- und Benutzerklassen2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem