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 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.

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 beim Buchen von Tickets schiefgelaufen ist.

Du organisierst deinen Code auf vier Dateien:

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

    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. Da TicketSoldOutException geprüft ist, must du sie behandeln. Fange zuerst TicketSoldOutException ab und gib Booking failed: [exception message] aus. Fange dann InvalidSeatException ab 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]"
    }
}
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