Integration der Ausnahmebehandlung
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 82 von 87.
Aufgabe
EinfachWir machen dein Bibliotheksverwaltungssystem robuster, indem wir eine geeignete Ausnahmebehandlung integrieren! Ein echtes Bibliothekssystem muss Fehlerbedingungen zuverlässig 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äftige Rückmeldungen liefern.
Du wirst deinen vorhandenen Code in sechs Dateien weiter ausbauen:
Book.java: Behalte deine Book-Klasse mit allen vorhandenen Funktionen bei: isbn, title, author, isAvailable, borrowedBy, getDetails() sowie den entsprechenden Gettern und Settern.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. Dies wird die übergeordnete Klasse für alle bibliotheksspezifischen Ausnahmen sein. Füge einen Konstruktor hinzu, der eine Nachricht akzeptiert und sie an die übergeordnete Klasse 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 Konstruktor 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 die MethodeborrowBook(String userId, String isbn)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 zu
throws LibraryExceptionund den Rückgabetyp zuString.Lass alle anderen Methoden (addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks) weiterhin wie zuvor funktionieren.
- Löse
Main.java: Demonstriere deine Ausnahmebehandlung! Du erhältst eine durch Kommas getrennte Zeichenkette mit Befehlen. Jeder Befehl verwendet eines der folgenden 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, bei jederLibraryExceptionhingegenError: [exception message].Gib nach der Verarbeitung aller Befehle
Operations completedaus.
Du erhältst eine Eingabe: eine durch Kommas getrennte Zeichenkette mit Befehlen.
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 würde deine Ausgabe beispielsweise wie folgt 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 erleichtert die Fehlersuche im Vergleich zu allgemeinen 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 Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung10Exception Handling in OOP
Hierarchie der Exception-KlassenBenutzerdefinierte ExceptionsGeprüfte vs. ungeprüfte FehlerTry-with-Resources-MusterRückblick – Validierter Benutzer13Projekt: Bibliotheksverwaltung
Projektübersicht & UML-EntwurfBuch- und BenutzerklassenAusleihsystemSuchfunktionalitätAdministrationsoberflächeIntegration der AusnahmebehandlungTesten und Integration2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler