Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen 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 (erweitert Exception) für den Fall, dass keine Tickets mehr verfügbar sind. Deine Ausnahme sollte in ihrem Konstruktor eine Nachricht akzeptieren und sie mithilfe von super(message) an die übergeordnete Klasse weitergeben.
  • InvalidSeatException.java: Erstelle eine benutzerdefinierte ungeprüfte Ausnahme (erweitert RuntimeException) 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 eine TicketSoldOutException mit der Nachricht "No tickets remaining". Wenn die Sitzplatznummer kleiner als 1 oder größer als die Gesamtzahl der Sitzplätze ist, wirf eine InvalidSeatException mit der Nachricht "Seat [seatNumber] does not exist". Andernfalls verringere die Anzahl der verfügbaren Sitzplätze um 1 und gib Booked seat [seatNumber] successfully aus.

    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 TicketBooth mit der angegebenen Gesamtzahl der Sitzplätze. Versuche anschließend, die angegebene Sitzplatznummer innerhalb eines Try-Catch-Blocks zu buchen. Da TicketSoldOutException geprüft ist, musst du sie behandeln. Fange zuerst TicketSoldOutException ab und gib Booking failed: [exception message] aus. Fange anschließend InvalidSeatException ab 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]"
    }
}
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

Übe selbstständig: Online-Java-Compiler