Menu
Coddy logo textTech

Checked vs. Unchecked Errors

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 61 von 87.

Du hast gesehen, dass die exception-Hierarchie von Java in verschiedene Zweige aufgeteilt ist. Der entscheidende Unterschied, den du verstehen musst, besteht zwischen checked und ungeprüften exceptions. Dies beeinflusst, wie du sie in deinem Code behandeln musst.

Checked exceptions sind exceptions, die der Compiler dich zwingt zu handle. Sie erweitern Exception directly (nicht über RuntimeException). Du musst sie entweder catch oder mit throws declare:

// Muss IOException behandeln - es ist checked
public void readFile(String path) throws IOException {
    FileReader reader = new FileReader(path);  // Kann IOException werfen
}

// Oder abfangen
public void readFileSafe(String path) {
    try {
        FileReader reader = new FileReader(path);
    } catch (IOException e) {
        System.out.println("File error: " + e.getMessage());
    }
}

Ungeprüfte exceptions erweitern RuntimeException. Der Compiler verlangt nicht, dass du sie handle. Sie weisen typischerweise auf Programmierfehler wie Nullreferenzen oder ungültigen Array-Zugriff hin:

// Keine throws-Deklaration nötig
public int divide(int a, int b) {
    return a / b;  // Kann ArithmeticException werfen (unchecked)
}

String name = null;
name.length();  // NullPointerException (unchecked)

Wenn du benutzerdefinierte exceptions erstellst, wähle die übergeordnete class danach aus, wie du möchtest, dass Aufrufer sie handle. Verwende checked exceptions für wiederherstellbare Bedingungen, die der Aufrufer erwarten sollte. Verwende unchecked exceptions für Programmierfehler, die in korrekt geschriebenem Code nicht auftreten sollten.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Altersverifizierungssystem, das den wesentlichen Unterschied zwischen checked und unchecked exceptions demonstriert! Du erstellst benutzerdefinierte exceptions beider Typen und siehst, wie der Compiler sie unterschiedlich behandelt.

Du organisierst deinen Code auf vier Dateien verteilt:

  • InvalidAgeException.java: Erstelle eine checked exception für Fehler bei der Altersvalidierung. Diese exception sollte direkt Exception erweitern, was bedeutet, dass Callers gezwungen sein werden, sie zu behandeln. Füge einen constructor hinzu, der eine message akzeptiert und sie an die übergeordnete class weitergibt.
  • NegativeAgeException.java: Erstelle eine unchecked exception für den Fall, dass jemand ein negatives Alter angibt (ein Programmierfehler, der bei korrekter Eingabe nicht auftreten sollte). Diese sollte RuntimeException erweitern. Füge einen constructor hinzu, der eine message akzeptiert und weitergibt.
  • AgeVerifier.java: Erstelle eine class, die Alter mithilfe beider exception-Typen validiert. Füge zwei statische Methoden hinzu:

    verifyAge(int age) – Diese Methode sollte NegativeAgeException (unchecked) mit der message "Age cannot be negative: [age]" auslösen, wenn das Alter kleiner als 0 ist. Wenn das Alter kleiner als 18 ist, löse InvalidAgeException (checked) mit der message "Must be 18 or older: [age]" aus. Andernfalls gib Age [age] verified successfully aus. Da diese Methode eine checked exception auslöst, musst du sie mit throws InvalidAgeException deklarieren.

    verifyAgeUncheckedOnly(int age) – Diese Methode verwendet ausschließlich unchecked exceptions. Wenn das Alter negativ ist, löse NegativeAgeException mit demselben Nachrichtenformat aus. Wenn das Alter kleiner als 18 ist, löse eine IllegalArgumentException mit der message "Too young: [age]" aus. Andernfalls gib Age [age] verified (unchecked method) aus. Beachte, dass diese Methode keine throws-Deklaration benötigt!

  • Main.java: Führe dein Verifizierungssystem zusammen! Du erhältst eine Eingabe: ein Alter (Ganzzahl).

    Gib zuerst === Checked Exception Method === aus und rufe verifyAge mit dem eingegebenen Alter auf. Da die Methode eine checked exception auslöst, musst du den Aufruf in einen try-catch-Block einschließen. Fange InvalidAgeException ab und gib Checked exception caught: [message] aus. Fange außerdem NegativeAgeException ab und gib Unchecked exception caught: [message] aus.

    Gib anschließend eine leere Zeile und === Unchecked Exception Method === aus. Rufe verifyAgeUncheckedOnly mit demselben Alter auf. Obwohl diese Methode exceptions auslösen kann, bist du nicht gezwungen, sie abzufangen. Schließe sie trotzdem in einen try-catch-Block ein, um Fehler ordnungsgemäß zu behandeln. Fange NegativeAgeException ab und gib Runtime exception caught: [message] aus. Fange IllegalArgumentException ab und gib Illegal argument caught: [message] aus.

Du erhältst eine Eingabe: eine Ganzzahl, die das zu verifizierende Alter darstellt.

Beachte den wesentlichen Unterschied: Die Methode mit der checked exception erfordert eine throws-Deklaration und zwingt Callers, sie zu behandeln, während die unchecked-Methode ohne jegliche exception-Behandlung problemlos kompiliert. Dies ist der grundlegende Unterschied zwischen checked und unchecked exceptions in Java!

Probier es selbst

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int age = scanner.nextInt();
        
        // TODO: Test the checked exception method
        // Print: "=== Checked Exception Method ==="
        // Rufe AgeVerifier.verifyAge(age) in einem try-catch auf
        // - Catch InvalidAgeException: print "Checked exception caught: [message]"
        // - Catch NegativeAgeException: print "Unchecked exception caught: [message]"
        
        
        // TODO: Print a blank line, then "=== Unchecked Exception Method ==="
        // Rufe AgeVerifier.verifyAgeUncheckedOnly(age) in einem try-catch auf
        // - Catch NegativeAgeException: print "Runtime exception caught: [message]"
        // - Catch IllegalArgumentException: print "Illegal argument caught: [message]"
        
    }
}
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