Benutzerdefinierte Exceptions
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 60 von 87.
Javas integrierte Exceptions decken viele gängige Fehlerszenarien ab, aber manchmal benötigen Sie Exceptions, die spezifisch für den Fachbereich Ihrer Anwendung sind. Benutzerdefinierte Exceptions ermöglichen es Ihnen, aussagekräftige Fehlertypen zu erstellen, die klar kommunizieren, was schiefgelaufen ist.
Um eine benutzerdefinierte Exception zu erstellen, erweitern Sie einfach eine bestehende Exception-Klasse. Für eine geprüfte Exception erweitern Sie Exception:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Für eine ungeprüfte Exception erweitern Sie RuntimeException:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}Der Aufruf von super(message) übergibt die Fehlermeldung an die Elternklasse, wodurch sie über getMessage() verfügbar wird. Sie können Ihre benutzerdefinierte Exception dann wie jede andere werfen 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 Exceptions machen Ihren Code lesbarer und ermöglichen es Aufrufern, spezifische Fehlerbedingungen unterschiedlich zu behandeln. Sie sind besonders wertvoll beim Erstellen von APIs oder Bibliotheken, bei denen eine klare Fehlerkommunikation wichtig ist.
Aufgabe
EinfachLassen Sie uns ein Ticketbuchungssystem bauen, das benutzerdefinierte Ausnahmen verwendet, um verschiedene Fehlerszenarien zu behandeln! Sie werden aussagekräftige Ausnahmetypen erstellen, die klar kommunizieren, was bei der Ticketbuchung schiefgelaufen ist.
Sie werden Ihren Code über vier Dateien organisieren:
TicketSoldOutException.java: Erstellen Sie eine benutzerdefinierte geprüfte Ausnahme (erweitertException) für den Fall, dass keine Tickets mehr verfügbar sind. Ihre Ausnahme sollte eine Nachricht in ihrem Konstruktor akzeptieren und diese mitsuper(message)an die Elternklasse weitergeben.InvalidSeatException.java: Erstellen Sie eine benutzerdefinierte ungeprüfte Ausnahme (erweitertRuntimeException) für den Fall, dass jemand versucht, eine ungültige Sitzplatznummer zu buchen. Diese Ausnahme sollte ebenfalls eine Nachricht akzeptieren und an ihre Elternklasse weitergeben.TicketBooth.java: Erstellen Sie eine Klasse, die den Ticketverkauf verwaltet. Ihr Stand sollte die Gesamtzahl der verfügbaren Plätze und die höchste gültige Sitzplatznummer verfolgen. Enthalten sein sollen:Ein Konstruktor, der die Gesamtzahl der verfügbaren Plätze entgegennimmt.
Eine
bookTicket(int seatNumber)Methode, die die Buchung validiert. Wenn keine Tickets mehr übrig sind (verfügbare Plätze sind 0 oder weniger), werfen Sie eineTicketSoldOutExceptionmit der Nachricht"No tickets remaining". Wenn die Sitzplatznummer kleiner als 1 oder größer als die Gesamtzahl der Plätze ist, werfen Sie eineInvalidSeatExceptionmit der Nachricht"Seat " + seatNumber + " does not exist". Andernfalls verringern Sie die verfügbaren Plätze um 1 und geben Sie"Booked seat " + seatNumber + " successfully"aus.Eine
getAvailableSeats()Methode, die die aktuelle Anzahl der verfügbaren Plätze zurückgibt.Main.java: Bringen Sie Ihr Ticketsystem zusammen! Sie erhalten zwei Eingaben: die Gesamtzahl der Plätze und eine zu buchende Sitzplatznummer.Erstellen Sie eine
TicketBoothmit der angegebenen Gesamtzahl an Plätzen. Versuchen Sie dann, die angegebene Sitzplatznummer innerhalb eines try-catch-Blocks zu buchen. DaTicketSoldOutExceptiongeprüft ist, müssen Sie sie behandeln. Fangen Sie zuerstTicketSoldOutExceptionab und geben Sie"Booking failed: " + e.getMessage()aus. Fangen Sie dannInvalidSeatExceptionab und geben Sie dasselbe Format aus:"Booking failed: " + e.getMessage().Geben Sie nach dem try-catch-Block
"Remaining seats: " + booth.getAvailableSeats()unter Verwendung der Getter-Methode aus.
Sie erhalten zwei Eingaben in der folgenden Reihenfolge: Gesamtzahl der Plätze (Integer) und die zu buchende Sitzplatznummer (Integer).
Beachten Sie, wie geprüfte Ausnahmen (checked exceptions) den Aufrufer zwingen, sie zu behandeln (mit try-catch oder throws), während ungeprüfte Ausnahmen (unchecked exceptions) keine explizite Behandlung erfordern. Wählen Sie den Ausnahmetyp danach aus, ob der Fehler etwas ist, das der Aufrufer vorhersehen und beheben sollte!
Spickzettel
Um eine benutzerdefinierte Exception zu erstellen, erweitern Sie eine bestehende Exception-Klasse.
Für eine Checked Exception erweitern Sie Exception:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Für eine Unchecked Exception erweitern Sie RuntimeException:
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}Der Aufruf super(message) übergibt die Fehlermeldung an die Elternklasse, wodurch sie über getMessage() verfügbar wird.
Werfen und fangen Sie benutzerdefinierte Exceptions wie jede andere Exception:
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Balance too low: " + balance);
}
balance -= amount;
}
// Using it
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}Checked Exceptions zwingen Aufrufer dazu, diese mit try-catch oder throws zu behandeln. Unchecked Exceptions erfordern keine explizite Behandlung. Wählen Sie basierend darauf, ob der Fehler etwas ist, das Aufrufer vorhersehen 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 ein TicketBooth mit der angegebenen Anzahl an total seats
// TODO: Verwende einen try-catch-Block, um zu versuchen, den Sitzplatz zu buchen
// - Fange zuerst die TicketSoldOutException ab und gib "Booking failed: [exception message]" aus
// - Fange die InvalidSeatException ab und gib "Booking failed: [exception message]" aus
// TODO: Gib nach dem try-catch-Block "Remaining seats: [count]" aus
}
}
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