15 Fehler-Objekte: Werfen, Fangen, Behandeln Tritt während der Programm-Ausführung ein Fehler auf, wird die normale Programm-ausführung abgebrochen und ein Fehler-Objekt erzeugt (geworfen). Die Klasse Ì ÖÓÛ Ð fasst alle Arten von Fehlern zusammen. Ein Fehler-Objekt kann gefangen und geeignet behandelt werden. Idee: Explizite Trennung von normalem Programm-Ablauf (der effizient und übersichtlich sein sollte); und Behandlung von Sonderfällen (wie illegalen Eingaben, falscher Benutzung, Sicherheitsattacken,...) 402
Einige der vordefinierten Fehler-Klassen: Object java.lang Throwable Error RuntimeException ArithmeticException ClassCastException IndexOutOfBoundsException NegativeArraySizeException Exception IOException AWTException NullPointerException EOFException FileNotFoundException NumberFormatException 403
Die direkten Unterklassen von Ì ÖÓÛ Ð sind: ÖÖÓÖ für ernsthafte Fehler, die typischerweise zur Beendigung des gesamten Programms führen, und Ü ÔØ ÓÒ für bewältigbare Fehler oder Ausnahmen. Die Unterklasse ÊÙÒØ Ñ Ü ÔØ ÓÒ der Klasse Ü ÔØ ÓÒ fasst die bei normaler Programm-Ausführung evt. auftretenden Ausnahmen zusammen. Diese Fehler werden nicht im Kopf von Methoden deklariert und können, müssen aber nicht abgefangen werden. Alle Ausnahmen der Klasse Ü ÔØ ÓÒ außerhalb von ÊÙÒØ Ñ Ü ÔØ ÓÒ, die in einer Methode auftreten können und dort nicht selbst abgefangen werden, müssen explizit im Kopf der Methode aufgelistet werden. 404
Arten der Fehler-Behandlung: Ignorieren; Abfangen und Behandeln dort, wo sie entstehen; Abfangen und Behandeln an einer anderen Stelle. Tritt ein Fehler auf und wird nicht behandelt, bricht die Programm-Ausführung ab. Beispiel: ÔÙ Ð Ð ÖÓ ß ÔÙ Ð Ø Ø Ñ Ò ËØÖ Ò Ö µ ß ÒØ Ü ½¼ ÒØ Ý ¼ ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ü»Ýµ л» Ò Ó Ñ Ò µ л» Ò Ó Ð ÖÓ 405
Das Programm bricht wegen Division durch Òص¼ ab und liefert die Fehler-Meldung: Ü ÔØ ÓÒ Ò Ø Ö Ñ Ò Ú ºÐ Ò º Ö Ø Ñ Ø Ü ÔØ ÓÒ» Ý Þ ÖÓ Ø ÖÓºÑ Ò ÓÑÔ Ð Ó µ Die Fehlermeldung besteht aus drei Teilen: 1. Mitteilung des Thread, in dem der Fehler auftrat; 2. ËÝ Ø Ñº ÖÖºÔÖ ÒØÐÒ ØÓËØÖ Ò µµ Die ØÓËØÖ Ò µ-methode gibt den Namen der Klasse an, hier: Ú ºÐ Ò º Ö Ø Ñ Ø Ü ÔØ ÓÒ... gefolgt von einer Fehlermeldung, die die Objekt-Methode ØÅ µ liefert, hier:» Ý Þ ÖÓ. 3. ÔÖ ÒØËØ ÌÖ ËÝ Ø Ñº ÖÖµ Dieser Aufruf liefert die Funktion, in der der Fehler auftrat... genauer: der Angabe sämtlicher Aufrufe im Rekursions-Stack. Soll die Programm-Ausführung nicht beendet werden, muss der Fehler abgefangen werden. 406
Beispiel: ÆÙÑ Ö ÓÖÑ Ø Ü ÔØ ÓÒ ÑÔÓÖØ Ú º Óº ÔÙ Ð Ð Ò ß ÔÙ Ð Ø Ø ÚÓ Ñ Ò ËØÖ Ò Ö µ ß ÒØ Ü ÅÝÊ Öº ØÁÒØ ½º Ð Ø µ ÒØ Ý ÅÝÊ Öº ØÁÒØ ¾º Ð Ø µ ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ ËÙÑÑ Ø Ø Ü Ýµµ л» Ò Ó Ñ Ò µ л» Ò Ó Ð Ò ÔÙ Ð Ð ÅÝÊ Ö ß ÔÙ Ð Ø Ø ÒØ ØÁÒØ ËØÖ Ò ØÖµ ß Ù Ö Ê Ö Ø Ò Ò Û Ù Ö Ê Ö Ò Û ÁÒÔÙØËØÖ ÑÊ Ö ËÝ Ø Ñº Òµµ ÒØ Ö ÙÐØ ¼ ÓÓÐ Ò Ú Ð Ð ººº 407
Das Programm liest zwei ÒØ-Werte ein und addiert sie. Bei der Eingabe können möglicherweise Fehler auftreten:... weil keine syntaktisch korrekte Zahl eingegeben wird;... weil sonstige unvorhersehbare Ereignisse eintreffen :-) Die Behandlung dieser Fehler ist in der Funktion ØÁÒØ µ der Klasse ÅÝÊ Ö verborgen. Die ÓÓÐ Ò-Variable der Funktion ØÁÒØ µ soll den Wert ØÖÙ enthalten, wenn die Eingabe einer Zahl erfolgreich abgeschlossen ist... 408
Ð Ð Û Ð Ú Ð µ ß ËÝ Ø ÑºÓÙغÔÖ ÒØ ØÖµ ËÝ Ø ÑºÓÙغ ÐÙ µ ØÖÝ ß Ö ÙÐØ ÁÒØ ÖºÔ Ö ÁÒØ Ø ÒºÖ Ä Ò µµ Ú Ð ØÖÙ Ð Ø ÆÙÑ Ö ÓÖÑ Ø Ü ÔØ ÓÒ µ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ð Ò Æ Ø Ö Î Ö Ù ººº µ Ð Ø ÁÇ Ü ÔØ ÓÒ µ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ò ÔÖÓ Ð Ñ Ò ººº µ ËÝ Ø Ñº Ü Ø ¼µ Рл» Ò Ó Û Ð Ö ØÙÖÒ Ö ÙÐØ»» Ò Ó ØÁÒØ µ»» Ò Ó Ð ÅÝÊ Ö 409
... ermöglicht folgenden Dialog: Ú Ò ½º Ð Ð Ò Æ Ø Ö Î Ö Ù ººº ½º Ð ¼º Ð Ò Æ Ø Ö Î Ö Ù ººº ½º Ð ½ ¾º Ð ¾ ËÙÑÑ ¾ Ein Exception-Handler besteht aus einem ØÖÝ-Block ØÖÝ ß ss Ð, in dem der Fehler möglicherweise auftritt; gefolgt von einer oder mehreren Ø -Regeln. Wird bei der Ausführung der Statement-Folge ss kein Fehler-Objekt erzeugt, fährt die Programm-Ausführung direkt hinter dem Handler fort. Wird eine Exception ausgelöst, durchsucht der Handler mithilfe des geworfenen Fehler-Objekts sequentiell die Ø -Regeln. 410
Jede Ø -Regel ist von der Form: Ø Exc µ ߺººÐ wobei Exc eine Klasse von Fehlern angibt und ein formaler Parameter ist, an den das Fehler-Objekt gebunden wird. Eine Regel ist anwendbar, sofern das Fehler-Objekt aus (einer Unterklasse) von Exc stammt. Die erste Ø -Regel, die anwendbar ist, wird angewendet. Dann wird der Handler verlassen. Ist keine Ø -Regel anwendbar, wird der Fehler propagiert. 411
f() g() g() try... h() try... 412
f() g() g() try... h() try... Exception 413
Exception catch... h() try... 414
Exception catch... 415
Auslösen eines Fehlers verlässt abrupt die aktuelle Berechnung. Damit das Programm trotzdem nach Abfangen des Fehlers in einen geordneten Zustand kommt, ist oft Aufräumarbeit erforderlich wie z.b. das Schließen von Ein- oder Ausgabeströmen. Dazu dient die Regel Ò ÐÐÝ ß ss Ð nach einem ØÖÝ-Statement. Achtung: Die Folge ss von Statements wird auf jeden Fall ausgeführt. Wird kein Fehler im ØÖÝ-Block geworfen, wird sie im Anschluss an den ØÖÝ-Block ausgeführt. Wird ein Fehler geworfen und mit einer Ø -Regel gefangen, wird sie nach dem Block der Ø -Regel ausgeführt. Wird ein Fehler geworfen, aber von keiner Ø -Regel gefangen, wird ss ausgeführt, und dann der Fehler weitergereicht. 416
Beispiel: ÆÙÐÐÈÓ ÒØ Ö Ü ÔØ ÓÒ ÔÙ Ð Ð ÐÓÛ ß ÔÙ Ð Ø Ø ÚÓ ÐÓÛÍÔ µ ß Ç Ø Ü ÒÙÐÐ ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Üº Ó µµ Ð ÔÙ Ð Ø Ø ÚÓ Ñ Ò ËØÖ Ò Ö µ ß ØÖÝ ß ÐÓÛÍÔ µ Ð Ø Ð Ø Ü ÔØ ÓÒ µ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ð ÃÐ µ Ð Ò ÐÐÝ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ä Ö Ò Ü Ò Ò ººº µ Рл» Ò Ó Ñ Ò µ л» Ò Ó Ð ÐÓÛ 417
... liefert: Ú ÐÓÛ Ä Ö Ò Ü Ò Ò ººº Ü ÔØ ÓÒ Ò Ø Ö Ñ Ò Ú ºÐ Ò ºÆÙÐÐÈÓ ÒØ Ö Ü ÔØ ÓÒ Ø ÐÓÛº ÐÓÛÍÔ ÓÑÔ Ð Ó µ Ø ÐÓÛºÑ Ò ÓÑÔ Ð Ó µ Exceptions können auch selbst definiert und selbst geworfen werden. ÔÙ Ð Ð Ð ÛÁØ ÜØ Ò Ü ÔØ ÓÒ ß Ð ÛÁØ µ ßÐ Ð ÛÁØ ËØÖ Ò µ ß ÙÔ Ö µ Рл» Ò Ó Ð Ð ÛÁØ 418
ÔÙ Ð Ð ÐÓÛ ß ÔÙ Ð Ø Ø ÚÓ ÐÓÛÍÔ µ Ø ÖÓÛ Ð ÛÁØ ß Ø ÖÓÛ Ò Û Ð ÛÁØ µ Ð ÔÙ Ð Ø Ø ÚÓ Ñ Ò ËØÖ Ò Ö µ ß ØÖÝ ß ÐÓÛÍÔ µ Ð Ø ÊÙÒØ Ñ Ü ÔØ ÓÒ Öµ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ ÊÙÒÌ Ñ Ü ÔØ ÓÒ Ö Ò µ Ð Ø Ð ÛÁØ µ ß ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ Ð Û ÁØ µ ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ µ ËÝ Ø ÑºÓÙغÔÖ ÒØÐÒ º ØÅ µµ Рл» Ò Ó Ñ Ò Ð»» Ò Ó Ð Ü 419
Ein selbstdefinierter Fehler sollte als Unterklasse von Ü ÔØ ÓÒ deklariert werden. Die Klasse Ü ÔØ ÓÒ verfügt über die Konstruktoren ÔÙ Ð Ü ÔØ ÓÒ µ ÔÙ Ð Ü ÔØ ÓÒ ËØÖ Ò ØÖµ ( ØÖ ist die evt. auszugebende Fehlermeldung). Ø ÖÓÛ exc löst den Fehler exc aus sofern sich der Ausdruck exc zu einem Objekt einer Unterklasse von Ì ÖÓÛ Ð auswertet. Weil Ð ÛÁØ keine Unterklasse von ÊÙÒØ Ñ Ü ÔØ ÓÒ ist, wird die geworfene Exception erst vom zweiten Ø -Zweig gefangen. Ausgabe: Ð Û ÁØ Ð ÛÁØ ÆÙÐÐ 420
Fazit: Fehler in Java sind Objekte und können vom Programm selbst behandelt werden. ØÖÝ ººº Ø ººº Ò ÐÐÝ gestattet, die Fehlerbehandlung deutlich von der normalen Programmausführung zu trennen. Die vordefinierten Fehlerarten reichen oft aus. Werden spezielle neue Fehler/Ausnahmen benötigt, können diese in einer Vererbungshierarchie organisiert werden. 421
Warnung: Der Fehler-Mechanismus von Java sollte auch nur zur Fehler-Behandlung eingesetzt werden: Installieren eines Handlers ist billig; fangen einer Ü ÔØ ÓÒ dagegen teuer. Ein normaler Programm-Ablauf kann durch eingesetzte Ü ÔØ ÓÒs bis zur Undurchsichtigkeit verschleiert werden. Was passiert, wenn Ø - und Ò ÐÐÝ-Regeln selbst wieder Fehler werfen? Fehler sollten nach Möglichkeit dort behandelt werden, wo sie auftreten. Es ist besser spezifischere Fehler zu fangen als allgemeine z.b. mit Ø Ü ÔØ ÓÒ µ ß Ð 422