1. Einführung in Ausnahmen
Beginnen wir mit einer einfachen Analogie. Stellen Sie sich vor, Ihr Programm ist ein Auto, das auf der Straße fährt. Alles ist gut, bis plötzlich etwas Unerwartetes passiert: Der Reifen ist platt, der Benzin ist alle, der Motor überhitzt. Wenn man diese Situation nicht „behandelt“ (zum Beispiel kein Reserverad montiert oder nicht tankt), bleibt das Auto stehen und fährt nicht weiter. Genauso im Programm: Wenn die Ausnahme nicht behandelt wird, beendet sich das Programm abrupt.
Ausnahme (exception) – ist ein Objekt, das in dem Moment erzeugt wird, in dem während der Programmausführung ein Problem auftritt. Die Ausnahme sagt: „Stopp! Etwas ist schiefgelaufen!“
Beispiele für Situationen, in denen Ausnahmen auftreten:
- Division durch Null (10 / 0)
- Versuch, auf ein nicht vorhandenes Array-Element zuzugreifen (arr[999])
- Öffnen einer Datei, die auf dem Datenträger nicht existiert
- Konvertieren der Zeichenkette "abc" in eine Zahl (Integer.parseInt("abc"))
Wichtig: Ausnahmen sind keine Compilerfehler (zum Beispiel Tippfehler im Code), sondern Probleme, die während der Programmausführung auftreten.
Warum sind Ausnahmen gut?
- Sauberer Code: Die Kernlogik des Programms wird nicht durch ständige Prüfungen für jede Kleinigkeit zugemüllt.
- Flexibilität: Fehler lassen sich zentral behandeln (zum Beispiel alle Fehler beim Lesen von Dateien – an einer Stelle).
- Zuverlässigkeit: Das Programm „stürzt“ nicht mit einer rätselhaften Meldung ab, sondern teilt mit, was genau passiert ist.
2. Ausnahmen (Exceptions) vs. Fehler (Errors)
In Java gibt es zwei Hauptarten von Problemen, die während der Programmausführung auftreten können:
Fehler (Errors)
Fehler sind fatale, nicht wiederherstellbare Probleme, die durch Störungen in der Java Virtual Machine (JVM) selbst entstehen. Sie hängen häufig mit Systemressourcen oder internen Ausfällen der JVM zusammen.
Beispiele für Fehler:
- OutOfMemoryError – Speicher erschöpft.
- StackOverflowError – Stacküberlauf (zum Beispiel aufgrund unendlicher Rekursion).
Wichtig: Solche Fehler sollte man im Programm in der Regel nicht zu behandeln versuchen.
Ausnahmen (Exceptions)
Ausnahmen sind Probleme, mit denen ein Programm umgehen kann (und sollte). Sie entstehen durch Fehler in der Logik des Programms oder durch äußere Faktoren (zum Beispiel der Benutzer hat etwas Unerwartetes eingegeben).
Beispiele für Ausnahmen:
- NullPointerException – Versuch, null wie ein Objekt zu verwenden.
- ArrayIndexOutOfBoundsException – Index außerhalb des Arraybereichs.
- IOException – Fehler bei der Arbeit mit Dateien.
Ausnahmen in Java gibt es in zwei Arten:
- Checked exceptions (geprüft) – der Compiler verlangt ihre Behandlung (zum Beispiel IOException).
- Unchecked exceptions (ungeprüft) – der Compiler verlangt keine Behandlung (zum Beispiel NullPointerException).
Schema: Wo was einzuordnen ist
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(andere Exceptions)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
Erläuterung:
- Throwable – die Wurzel der gesamten Fehler- und Ausnahmehierarchie in Java.
- Error – fatale JVM-Fehler, werden nicht behandelt.
- Exception – „normale“ Ausnahmen, die man behandeln kann und sollte.
- RuntimeException – ungeprüfte Ausnahmen (Programmierfehler).
3. Wie sieht das im Code aus?
Beispiel 1: Division durch Null
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // Hier tritt eine ArithmeticException auf!
System.out.println("Ergebnis: " + c);
}
}
Was passiert?
Das Programm beendet sich mit einem Fehler, und Sie sehen die Meldung:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Beispiel 2: Zugriff auf ein nicht vorhandenes Array-Element
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Beispiel 3: Arbeit mit Dateien
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
Und wie man solche Ausnahmesituationen elegant behandelt, schauen wir uns jetzt an.
GO TO FULL VERSION