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 class, sodass sie über getMessage() verfügbar ist. Du kannst deine benutzerdefinierte custom exception anschließend wie jede andere exception werfen und mit catch 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());
}Custom exceptions 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 beim Buchen von Tickets schiefgelaufen ist.
Du organisierst deinen Code auf vier Dateien:
TicketSoldOutException.java: Erstelle eine benutzerdefinierte geprüfte Ausnahme (extendsException) für den Fall, dass keine Tickets mehr verfügbar sind. Deine Ausnahme sollte in ihrem Konstruktor eine message akzeptieren und sie mithilfe vonsuper(message)an die übergeordnete class weitergeben.InvalidSeatException.java: Erstelle eine benutzerdefinierte ungeprüfte Ausnahme (extendsRuntimeException) für den Fall, dass jemand versucht, eine ungültige Sitzplatznummer zu buchen. Diese Ausnahme sollte ebenfalls eine message akzeptieren und an ihre übergeordnete class weitergeben.TicketBooth.java: Erstelle eine class, die den Ticketverkauf manages. Dein Schalter sollte die Gesamtzahl der verfügbaren Sitzplätze und die höchste gültige Sitzplatznummer verfolgen. Füge Folgendes ein:Einen Konstruktor, der die Gesamtzahl der verfügbaren Sitzplätze entgegennimmt.
Eine
bookTicket(int seatNumber)-Methode, die die Buchung validiert. Wenn keine Tickets mehr verfügbar sind (die Anzahl der verfügbaren Sitzplätze 0 oder weniger beträgt), wirf eineTicketSoldOutExceptionmit der message"No tickets remaining". Wenn die Sitzplatznummer kleiner als 1 oder größer als die Gesamtzahl der Sitzplätze ist, wirf eineInvalidSeatExceptionmit der message"Seat [seatNumber] does not exist". Otherwise, verringere die Anzahl der verfügbaren Sitzplätze um 1 und gibBooked seat [seatNumber] successfullyaus.Eine
getAvailableSeats()-Methode, die den aktuellen count 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 mit der angegebenen Gesamtzahl der Sitzplätze eine
TicketBooth. Versuche dann, die angegebene Sitzplatznummer innerhalb eines try-catch-Blocks zu buchen. DaTicketSoldOutExceptiongeprüft ist, must du sie behandeln. Fange zuerstTicketSoldOutExceptionab und gibBooking failed: [exception message]aus. Fange dannInvalidSeatExceptionab und gib dasselbe Format aus:Booking failed: [exception message].Gib After dem try-catch-Block mithilfe der Getter-Methode
Remaining seats: [count]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 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 Benutzer2Zugriffsmodifikatoren & 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