Tracks
/
Java
Java
/
Lehrplan
/
Ausnahmen
Au

Ausnahmen in Java

25 Übungen

Über Ausnahmen

Die Programmiersprache Java verwendet Exceptions, um Fehler und andere außergewöhnliche Ereignisse zu behandeln.

Was ist eine Exception

Eine Exception ist ein Ereignis, das während der Ausführung eines Programms auftritt und den normalen Ablauf der Anweisungen unterbricht. Exceptions werden in Java explizit geworfen, und diesen Vorgang nennt man Werfen einer Exception. Das Behandeln einer Exception nennt man Abfangen einer Exception.

In Java sind alle Exceptions Unterklassen der Klasse Exception, die selbst eine Unterklasse von Throwable ist.

Java unterscheidet zwei Arten von Exceptions:

  1. Geprüfte Exceptions
  2. Ungeprüfte Exceptions

Geprüfte Exceptions

Geprüfte Exceptions sind außergewöhnliche Bedingungen, die eine Anwendung vorhersehen und aus denen sie sich erholen sollte. Ein Beispiel für eine geprüfte Exception ist die FileNotFoundException, die auftritt, wenn eine Methode versucht, eine Datei zu lesen, die nicht existiert.

Diese Art von Exception wird zur Compile-Zeit geprüft: Methoden, die geprüfte Exceptions werfen, müssen dies in ihrer Methodensignatur angeben, und Code, der eine Methode aufruft, die eine geprüfte Exception werfen könnte, muss diese behandeln, sonst lässt sich der Code nicht kompilieren.

Alle geprüften Exceptions sind Unterklassen von Exception, die nicht RuntimeException erweitern.

Ungeprüfte Exceptions

Ungeprüfte Exceptions sind außergewöhnliche Bedingungen, die eine Anwendung normalerweise nicht vorhersehen oder aus denen sie sich nicht erholen kann. Ein Beispiel für eine ungeprüfte Exception ist die NullPointerException, die auftritt, wenn eine Methode einen Nicht-Null-Wert erwartet, aber null erhält.

Diese Art von Exception wird nicht zur Compile-Zeit geprüft: Methoden, die ungeprüfte Exceptions werfen, müssen dies nicht in ihrer Methodensignatur angeben, und Code, der eine Methode aufruft, die eine ungeprüfte Exception werfen könnte, muss diese nicht behandeln.

Alle ungeprüften Exceptions erben von RuntimeException, die selbst eine Erweiterung von Exception ist.

Exceptions werfen

Eine Methode in Java kann eine Exception werfen, indem sie die throw-Anweisung verwendet.

Eine geprüfte Exception werfen

Wenn eine Methode eine geprüfte Exception wirft, muss sie dies in der Methodensignatur mit dem throws-Schlüsselwort angeben, wie im folgenden Beispiel gezeigt. Dadurch muss aufrufender Code damit rechnen, dass eine Exception geworfen werden könnte, und sie entsprechend behandeln.

public class InsufficientBalanceException extends Exception {

}

public class BankAccount {
  public void withdraw(double amount) throws InsufficientBalanceException {
    if (balance < amount) {
      throw new InsufficientBalanceException();
    }

    // rest of the method implementation
  }
}

Eine ungeprüfte Exception werfen

Wenn eine Methode eine ungeprüfte Exception wirft, muss sie dies nicht in der Methodensignatur angeben, obwohl es unterstützt wird.

public class BankAccount {
  public void withdraw(double amount) {
    if (amount < 0) {
      throw new IllegalArgumentException("Cannot withdraw a negative amount");
    }

    // rest of the method implementation
  }
}

Exceptions behandeln

Das Behandeln von Exceptions in Java erfolgt mit den Schlüsselwörtern try, catch und finally.

  • Code-Anweisungen, die eine Exception werfen könnten, sollten in einen try-Block eingeschlossen werden.
  • Auf den try-Block folgen ein oder mehrere catch-Blöcke, die die im try-Block geworfenen Exceptions abfangen.
  • Auf die catch-Blöcke folgt optional ein finally-Block, der immer nach dem try-Block ausgeführt wird, unabhängig davon, ob eine Exception geworfen wurde oder nicht.

Das folgende Beispiel zeigt, wie diese Schlüsselwörter funktionieren:

public class ATM {
  public void withdraw(BankAccount bankAccount, double amount) {
    try {
      System.out.println("Withdrawing " + amount);
      bankAccount.withdraw(amount);
      System.out.println("Withdrawal succeeded");
    } catch (InsufficientBalanceException) {
      System.out.println("Withdrawal failed: insufficient balance");
    } catch (RuntimeException e) {
      System.out.println("Withdrawal failed: " + e.getMessage());
    } finally {
      System.out.println("Current balance: " + bankAccount.getBalance());
    }
  }
}

Wenn in diesem Beispiel keine Exception geworfen wird, wird Folgendes ausgegeben:

Withdrawing 10.0
Withdrawal succeeded
Current balance: 5.0

Falls jedoch die Anweisung bankAccount.withdraw(amount) eine InsufficientBalanceException wirft, wird Folgendes ausgegeben:

Withdrawing 10.0
Withdrawal failed: insufficient balance
Current balance: 5.0

Oder, falls eine ungeprüfte Exception von bankAccount.withdraw(amount) geworfen wird, wird Folgendes ausgegeben:

Withdrawing -10.0
Withdrawal failed: Cannot withdraw a negative amount
Current balance: 5.0

Fehler

Java hat außerdem eine separate Kategorie namens Fehler. Dabei handelt es sich um schwerwiegende Probleme, die außerhalb einer Anwendung liegen. Ein Beispiel für einen Fehler ist der OutOfMemoryError, der auftritt, wenn eine Anwendung mehr Speicher verwenden möchte, als im System verfügbar ist.

Wie ungeprüfte Exceptions werden Fehler nicht zur Compile-Zeit geprüft. Der Unterschied besteht darin, dass sie Probleme auf Systemebene darstellen und im Allgemeinen von der Java Virtual Machine oder der Umgebung geworfen werden statt von der Anwendung. Anwendungen sollten im Allgemeinen nicht versuchen, sie abzufangen oder zu behandeln.

Alle Fehler in Java erben von der Klasse Error.

Wann man keine Exceptions verwenden sollte

Wie bereits erwähnt, sind Exceptions Ereignisse, die den normalen Ablauf der Anweisungen unterbrechen, und werden verwendet, um außergewöhnliche Ereignisse zu behandeln. Daher ist es nicht empfehlenswert, Exceptions zur Ablaufsteuerung zu verwenden.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Ausnahmen