Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 (erweitert Exception) für den Fall, dass keine Tickets mehr verfügbar sind. Ihre Ausnahme sollte eine Nachricht in ihrem Konstruktor akzeptieren und diese mit super(message) an die Elternklasse weitergeben.
  • InvalidSeatException.java: Erstellen Sie eine benutzerdefinierte ungeprüfte Ausnahme (erweitert RuntimeException) 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 eine TicketSoldOutException mit der Nachricht "No tickets remaining". Wenn die Sitzplatznummer kleiner als 1 oder größer als die Gesamtzahl der Plätze ist, werfen Sie eine InvalidSeatException mit 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 TicketBooth mit der angegebenen Gesamtzahl an Plätzen. Versuchen Sie dann, die angegebene Sitzplatznummer innerhalb eines try-catch-Blocks zu buchen. Da TicketSoldOutException geprüft ist, müssen Sie sie behandeln. Fangen Sie zuerst TicketSoldOutException ab und geben Sie "Booking failed: " + e.getMessage() aus. Fangen Sie dann InvalidSeatException ab 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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung