Benutzerdefinierte Exceptions
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 60 von 87.
Javas integrierte Ausnahmen decken viele häufige Fehlerszenarien ab, aber manchmal benötigst du Ausnahmen, die speziell auf die Domäne deiner Anwendung zugeschnitten sind. Benutzerdefinierte Ausnahmen ermöglichen es dir, aussagekräftige Fehlertypen zu erstellen, die klar vermitteln, was schiefgelaufen ist.
Um eine benutzerdefinierte Ausnahme zu erstellen, erweitere einfach eine vorhandene Ausnahmeklasse. Für eine geprüfte Ausnahme erweitere Exception:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Für eine ungeprüfte Ausnahme erweitere RuntimeException:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}Der Aufruf super(message) übergibt die Fehlermeldung an die übergeordnete Klasse, sodass sie über getMessage() verfügbar ist. Du kannst deine benutzerdefinierte Ausnahme dann wie jede andere auslösen und abfangen:
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Balance too low: " + balance);
}
balance -= amount;
}
// Verwendung
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}Benutzerdefinierte Ausnahmen machen deinen Code lesbarer und ermöglichen es Aufrufern, bestimmte Fehlerbedingungen unterschiedlich zu behandeln. Sie sind besonders wertvoll beim Erstellen von APIs oder Bibliotheken, bei denen eine klare Fehlerkommunikation wichtig ist.
Aufgabe
EinfachErstellen wir ein Ticketbuchungssystem, das benutzerdefinierte Ausnahmen verwendet, um verschiedene Fehlerszenarien zu behandeln! Du erstellst aussagekräftige Ausnahmetypen, die klar vermitteln, was bei der Buchung von Tickets schiefgelaufen ist.
Du wirst deinen Code auf vier Dateien verteilen:
TicketSoldOutException.java: Erstelle eine benutzerdefinierte geprüfte Ausnahme (erweitertException) für den Fall, dass keine Tickets mehr verfügbar sind. Deine Ausnahme sollte in ihrem Konstruktor eine Nachricht akzeptieren und sie mithilfe vonsuper(message)an die übergeordnete Klasse weitergeben.InvalidSeatException.java: Erstelle eine benutzerdefinierte ungeprüfte Ausnahme (erweitertRuntimeException) für den Fall, dass jemand versucht, eine ungültige Sitzplatznummer zu buchen. Auch diese Ausnahme sollte eine Nachricht akzeptieren und an ihre übergeordnete Klasse weitergeben.TicketBooth.java: Erstelle eine Klasse, die den Ticketverkauf verwaltet. Deine Verkaufsstelle sollte die Gesamtzahl der verfügbaren Sitzplätze und die höchste gültige Sitzplatznummer speichern. Füge Folgendes hinzu:Einen Konstruktor, der die Gesamtzahl der verfügbaren Sitzplätze entgegennimmt.
Eine Methode
bookTicket(int seatNumber), die die Buchung validiert. Wenn keine Tickets mehr übrig sind (die Anzahl der verfügbaren Sitzplätze also 0 oder weniger beträgt), wirf eineTicketSoldOutExceptionmit der Nachricht"No tickets remaining". Wenn die Sitzplatznummer kleiner als 1 oder größer als die Gesamtzahl der Sitzplätze ist, wirf eineInvalidSeatExceptionmit der Nachricht"Seat [seatNumber] does not exist". Andernfalls verringere die Anzahl der verfügbaren Sitzplätze um 1 und gibBooked seat [seatNumber] successfullyaus.Eine Methode
getAvailableSeats(), die die aktuelle Anzahl der verfügbaren Sitzplätze zurückgibt.Main.java: Führe dein Ticketsystem zusammen! Du erhältst zwei Eingaben: die Gesamtzahl der Sitzplätze und eine zu buchende Sitzplatznummer.Erstelle ein
TicketBoothmit der angegebenen Gesamtzahl der Sitzplätze. Versuche anschließend, die angegebene Sitzplatznummer innerhalb eines Try-Catch-Blocks zu buchen. DaTicketSoldOutExceptiongeprüft ist, musst du sie behandeln. Fange zuerstTicketSoldOutExceptionab und gibBooking failed: [exception message]aus. Fange anschließendInvalidSeatExceptionab und gib dasselbe Format aus:Booking failed: [exception message].Gib nach dem Try-Catch-Block
Remaining seats: [count]mithilfe der Getter-Methode aus.
Du erhältst zwei Eingaben in dieser Reihenfolge: die Gesamtzahl der Sitzplätze (Ganzzahl) und die zu buchende Sitzplatznummer (Ganzzahl).
Beachte, wie geprüfte Ausnahmen Aufrufer dazu zwingen, sie zu behandeln (mit Try-Catch oder throws), während ungeprüfte Ausnahmen keine explizite Behandlung erfordern. Wähle den Ausnahmetyp danach aus, ob der Fehler etwas ist, das Aufrufer erwarten und beheben sollten!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int totalSeats = scanner.nextInt();
int seatNumber = scanner.nextInt();
// TODO: Erstelle einen TicketBooth mit der gegebenen Gesamtzahl an Sitzplätzen
// TODO: Verwende einen try-catch-Block, um die Buchung des Sitzplatzes zu versuchen
// - Fange TicketSoldOutException zuerst ab und gib "Booking failed: [exception message]" aus
// - Fange InvalidSeatException ab und gib "Booking failed: [exception message]" aus
// TODO: After the try-catch, print "Remaining seats: [count]"
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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 Benutzer2Zugriffsmodifikatoren & 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