Integration von Exception Handling
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 82 von 87.
Aufgabe
EinfachVerbessern 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 namensLibraryException, dieExceptionerweitert. 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, dieLibraryExceptionerweitert. 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 wieBook not available: [isbn]erstellt.Library.java: Aktualisiere deine Library-Klasse so, dass sie Ausnahmen auslöst, anstatt Fehlermeldungen auszugeben. Ändere dieborrowBook(String userId, String isbn)-Methode wie folgt:- Löse
LibraryExceptionmit der NachrichtUser not found: [userId]aus, wenn der Benutzer nicht existiert. - Löse
LibraryExceptionmit der NachrichtBook not found: [isbn]aus, wenn das Buch nicht existiert. - Löse
BookNotAvailableExceptionaus, 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 LibraryExceptionund den Rückgabetyp inString.Alle anderen Methoden (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) sollen wie bisher funktionieren.
- Löse
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:authorREGISTER_USER:id:nameBORROW:userId:isbn
Verarbeite jeden Befehl. Gib für ADD_BOOK
Added: [title]aus. Gib für REGISTER_USERRegistered: [name]aus. Verwende für BORROW-Befehle einen try-catch-Block zur Behandlung von Ausnahmen: Gib bei Erfolg die Bestätigungsnachricht aus und bei jederLibraryExceptionError: [exception message].Gib nach der Verarbeitung aller Befehle
Operations completedaus.
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 completedBeachte, 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
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 BenutzerklassenAusleihsystemSuchfunktionalitätAdmin-InterfaceIntegration von Exception HandlingTesten und Integration2Zugriffsmodifikatoren & 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Übe selbstständig: Online-Java-Compiler