Vorlesung Informatik 2 - Teil A: Java Kurs

5.1 Übersicht zu Exceptions

Fehler können viele Ursachen haben, z.B.
  • Der Anwender macht eine falsche oder verbotene Eingabe
  • Das Programm ist fehlerhaft
  • Äußere Einflüsse:
    • Netzwerk oder I/O Fehler
    • Zugriffsrechte
    • Ressource nicht vorhanden (Datei/Verzeichnis/URL/...)

Die Reaktion auf Fehler hängt von mehreren Faktoren ab:

  • die Art des Fehlers: bei einer falschen Benutzereingabe weist man den Anwender darauf hin und probiert es nochmal, bei einem Softwarefehler bricht man das Programm ab oder versucht, wieder in einen definierten Zustand zurückzukehren.
  • die Wichtigkeit der Software: Die Steuerung eines Beatmungsgerätes kann bei einer NullPointerException nicht einfach terminieren, eine Übung im Fach Informatik schon.

Oft ist es wichtig, noch Daten zu retten indem man derzeit offene Dateien schließt und den aktuellen Zustand des Programmes konserviert.

Auch die Art der Information, die  zu einem Fehler ausgegeben wird, hängt von der Art des Fehlers ab. Programmfehler sollten lokalisierbar sein, d.h. die Klasse und die Methode sowie der System-Stack sind eine wichtige Information. Bei Anwenderfehlern ist das jedoch uninteressant.

Ein weiteres Problem: allgemeine Klassen und Methoden kennen nicht den Kontext, in dem sie angewendet werden. Die Klasse java.util.LinkedList wird tausendfach verwendet, die Reaktion auf einen Fehler kann aber ganz unterschiedlich sein, je nachdem ob gerade ein Kraftwerk gesteuert wird oder jemand ein Spiel zum Zeitvertreib programmiert hat.

Die Umgebung, aus der eine Methode gerufen wird, muss also entscheiden können, wie sie auf Fehler reagiert.

Die Lösung sind Exceptions: Der Fehler wird geworfen wie eine heiße Kartoffel, und wer sich darum kümmern kann und will, fängt ihn auf.

Exceptions  speichern im Konstruktor den System-Stack, also den Zustand der Anwendung in dem Moment in dem sie erzeugt werden. 

Von der Klasse Exception ist eine ganze Hierarchie von Fehlern abgeleitet, ca. 100 Exception-Klassen sind direkte Nachkommen und mehrere hundert sind indirekte Nachkommen.

Eine der von Exception abgeleiteten Klassen ist RuntimeException, davon wiederum sind drei alte Bekannte abgeleitet: NullPointerException, IndexOutOfBoundsException sowie ClassCastException.

Die von RuntimeException abgeleiteten Klassen haben eine Besonderheit: sie müssen nicht unbedingt abgefangen werden. Deshalb haben wir uns bisher auch nicht darum kümmern müssen, wie man diese Fehler behandelt, statt dessen wurden sie an die Java Virtual Machine weitergegeben und diese hat das Programm terminiert und den System-Stack ausgegeben.

Im nächsten Kapitel sehen wir, wie man Ausnahmen selbst behandelt statt dass sich die Java Laufzeitumgebung darum kümmert.


Lehrvideo  (YouTube)