Exceptions. Programmiermethodik. Eva Zangerle Universität Innsbruck

Ähnliche Dokumente
Exceptions. Programmiermethodik. Eva Zangerle Universität Innsbruck

Grundlagen der Programmierung Prof. H. Mössenböck. 16. Ausnahmen (Exception Handling)

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Vorlesung 10. Sitzung Grundlegende Programmiertechniken

Grundlagen der Fehlerbehandlung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 06: Ausnahme- und Fehlerbehandlung in Java.

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

Exception. 6. Exceptions. Die Klasse java.lang.exception. Fehlermeldung. Klassenname. Ort des Auftretens

9. Fehler und Ausnahmen Grundlagen der Programmierung 1 (Java)

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

15 Fehlerobjekte: Werfen, Fangen, Behandeln

15 Fehlerobjekte: Werfen, Fangen, Behandeln. Idee. Fehlerklassen. Fehlerklassen

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

15 Fehlerobjekte: Werfen, Fangen, Behandeln

3. Exceptions. Hintergrund: Programmieren auf der Basis von Verträgen. Kundenklasse. Lieferantenklasse

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

Ausnahmen. Exceptions. Definition Ausnahmen erzeugen Ausnahmen abfangen Ausnahmen weiterleiten. Dr. Beatrice Amrhein

Ausnahmebehandlung in Java

Vorlesung Programmieren

Java Fehlerbehandlung

1.7 Fehler- und Ausnahmebehandlung

Enumerations und innere Klassen

Java : Fehlerbehandlung.

Javakurs für Anfänger

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Java Einführung Exception Handling. Kapitel 17

Soll die Programm-Ausführung nicht beendet werden, muss der Fehler abgefangen werden. NumberFormatException

Grundlagen der Programmierung. Kapitel 9: Ausnahmen. Überblick. Fehlerbehandlung in Software-Systemen. Ziel der Vorlesung

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Ausnahmenbehandlung in Java. Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien

Einführung in die Programmierung Blockkurs Java

5.13 Umgang mit Fehlern

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

Javakurs zu Informatik I. Henning Heitkötter

Exceptions und Vererbung

Objektorientierte Programmierung. Kapitel 13: Exceptions

Fehler die bei der Programmerstellung passieren können teilweise vom Compiler erkannt werden

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 12. Fehler und Ausnahmen

Programmieren in Java

Kapitel 9: Klassen und höhere Datentypen. Selektoren

12. Advanced Features, Abschluss

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Vorlesung Programmieren

Java - Fehler im Code. Leibniz Universität IT Services Anja Aue

Java I Vorlesung Exceptions

7. Java Fehler und Ausnahmen

9. Fehlerbehandlung Advanced Programming Techniques. Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Aufgabe 1: Objekte, Klassen, Vererbung (15 Punkte)

4.5 Exceptions. TU Darmstadt Allgemeine Informatik II, SS 05

Java Vererbung. Inhalt

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 18: Exceptions II

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

15 Fehler-Objekte: Werfen, Fangen, Behandeln

Grundlagen der Informatik für Ingenieure I

II.1.1. Erste Schritte - 1 -

Die Klasse java.lang.object. Thorsten Treffer

12 Abstrakte Klassen, finale Klassen und Interfaces

Überschreiben von Methoden

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

SEP 114. Design by Contract

Enumerationen. Einführung. Probleme. Enumerationen. Wir benötigen in Programmen manchmal vordefinierte Menge von Werten.

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

Ausnahmebehandlung OOPM, Ralf Lämmel

1.) Behandlung von Laufzeitfehlern in Visual Basic

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Programmieren in Java

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Objektorientierte Programmierung. Kapitel 18: Exceptions II

1 Klassen anlegen und Objekte erzeugen

Programmiermethodik 1. Klausur

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

3 Objektorientierte Konzepte in Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Programmiermethodik 3. Klausur Lösung

Einstieg in die Informatik mit Java

Objektorientierte Programmierung Studiengang Medieninformatik

Einführung in die Programmierung mit Java

Algorithmen und Programmierung III WS 05/06

1 Klassen anlegen und Objekte erzeugen

Objektorientierung (OO)

Algorithmen und Datenstrukturen

Strukturierte Ausnahmebehandlung Exceptions

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Wiederholung zur Vorlesung Programmieren

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Praktische Softwaretechnologie Vorlesung 4

Große Übung Praktische Informatik 1

Grundlagen der Informatik Ausnahmebehandlung & Threads

2 Eine einfache Programmiersprache

Einführung in die Programmiersprache Java II

1.5. Strukturierte Anweisungen

Probeklausur: Programmierung WS04/05

Transkript:

Exceptions Programmiermethodik Eva Zangerle Universität Innsbruck

Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle Themen Generische Programmierung Java Collection-Framework Libraries Streams Unit-Tests GUI-Programmierung Entwurfsmuster Java Virtual Machine Ausblick Assertions Ausnahmen (Exceptions) 2

Motivation Fehler können unerwartet auftreten. Programme müssen auf Fehlersituationen vorbereitet werden und kontrolliert darauf reagieren. In C: Fehler werden über (überladene) Rückgabewerte erkannt. kein einheitliches Vorgehen Rückgabewerte werden nicht immer überprüft Programmfluss unterbrochen In Java Assertions für die Absicherung der inneren Programmlogik Exceptions für das Einhalten beliebiger Randbedingungen Programmiermethodik - Ausnahmebehandlung 3

Ausnahmen (Exceptions)

Motivation In einem ablaufenden Programm können Fehler auftreten. Logische Fehler im Programm Fehlerhafte Bedienung Falsche Eingaben Probleme im Java-Laufzeitsystem Technische Fehler (Speicherplatz, Klasse von Laufzeitumgebung nicht gefunden) Exceptions (Ausnahmen) sind ein Sprachmittel zur kontrollierten Reaktion auf Laufzeitfehler! Assertions sind ein Sonderfall davon. Programmiermethodik - Ausnahmebehandlung 5

Exception Handling Verfahren, das mit dem Eintreten einer Ausnahmesituation (Erfüllen bestimmter Bedingungen) den normalen Programmfluss verlässt Kontrolle geht an Mechanismus der Ausnahmebehandlung über Ausnahme in Java ist ein Exception-Objekt Grundfrage: was ist eine Ausnahmesituation? Programmiermethodik - Ausnahmebehandlung 6

Exceptions Vorteile durch Exceptions Fehler (und Exceptions) können nicht ignoriert werden und es müssen Maßnahmen zur Behandlung getroffen werden. Code für Programmablauf und Fehlerbehandlung wird getrennt Übersicht und Wartbarkeit Exception-Code nur an zwei Stellen Stelle, an der der Fehler auftritt Stelle, an der der Fehler behandelt wird Exceptions sind dokumentiert und dokumentierbar Exception-Handling Ausnahmesituationen werden an bestimmten Punkten im Programm abgeprüft (und gemeldet). An einer anderen Stelle im Programm steht Code zur Reaktion auf potenzielle Ausnahmesituationen. Programmiermethodik - Ausnahmebehandlung 7

Grundprinzip der Ausnahmebehandlung Information über die Ausnahme wird in ein spezielles Objekt verpackt. Instanz der Klasse Exception (oder einer Subklasse davon) Eine Ausnahme kann auch explizit ausgelöst werden. mit Hilfe von throw Die Ausnahme kann an einer bestimmten Stelle (äußerer Block, aufrufende Methode etc.) in einer catch-klausel abgefangen werden. Grundkonstrukt try catch-anweisung Programmiermethodik - Ausnahmebehandlung 8

Die try-catch Anweisung (Grundform) Schema try { regulärer Code, in dem Fehler auftreten kann } catch (ExceptionType1 e) { Code für Fehlerbehandlung } catch (ExceptionType2 e) { Code für Fehlerbehandlung } } catch (ExceptionTypex e) { Code für Fehlerbehandlung } try- und catch-block (bzw. Blöcke) folgen unmittelbar aufeinander. Programmiermethodik - Ausnahmebehandlung 9

Ablauf (einfach) Normalfall try { } catch (E1 e){ } catch (E2 e){ } catch (E3 e){ }... Ausnahmefall E1 Ausnahmefall E2 Ausnahmefall E4 E4 muss an einer anderen Stelle behandelt werden. Programmiermethodik - Ausnahmebehandlung 10

Ablauf (1) Wird eine Ausnahme vom Typ E geworfen: Dann wird eine entsprechende catch-klausel vom Typ E gesucht. Statt E kann auch eine Klausel mit einer Superklasse von E verwendet werden, da E dort substituiert werden kann! Reihenfolge der catch-klauseln ist entscheidend. Eine Ausnahme wird der Reihe nach mit den catch-klauseln verglichen. Ausgeführt wird die erste catch-klausel, zu der die Ausnahme kompatibel ist. Nachfolgende catch-klauseln werden ignoriert. Daher sollte eine Ordnung der catch-klauseln beachtet werden! Von speziell zu allgemein! Wenn zuerst eine allgemeinere Ausnahme angegeben wird (und dann eine speziellere) dann kommt es zu einem Compiler-Fehler. Programmiermethodik - Ausnahmebehandlung 11

Ablauf (2) Falls keine catch-klausel gefunden wird, wird in den äußeren try-blöcken gesucht. In verschachtelten try-blöcken Entlang der Methodenaufrufkette (wird noch besprochen) Wird nie eine catch-klausel gefunden (auch nicht in main), dann bricht das Programm ab. Programmiermethodik - Ausnahmebehandlung 12

Termination Model / Resumption Model Termination Model Die Ausnahmebehandlung in Java folgt dem Termination-Model. Der Kontrollfluss kehrt nicht mehr an die Stelle zurück, an der die Ausnahme aufgetreten ist (kehrt an Position nach Catch-Blöcken zurück). Resumption Model Eine Alternative ist das Resumption-Model. Bei diesem Modell erfolgt eine Rückkehr an die Aufrufstelle, d.h. das Programm setzt an der Stelle der Ausnahme fort. Wird nicht in Java verwendet. Programmiermethodik - Ausnahmebehandlung 13

Beispiel public final class ExceptionTest { public static void main(final String[] args) { try { int x, y; x = Integer.parseInt(args[0]); y = Integer.parseInt(args[1]); System.out.println(x / y); } catch (final NumberFormatException e) { } } System.out.println("Es wurde keine Integerzahl eingegeben!"); Kann parseint() // Zusaetzliche Fehlerbehandlung auftreten. } catch (final ArrayIndexOutOfBoundsException e) { System.out.println("Bitte mindestens 2 Parameter angeben!"); // Zusaetzliche Fehlerbehandlung } catch (final ArithmeticException e) { System.out.println("Division durch 0!"); // Zusaetzliche Fehlerbehandlung } Bei der Division java ExceptionTest Bitte mindestens 2 Parameter angeben! java ExceptionTest 1 a Es wurde keine Integerzahl eingegeben! Programmiermethodik - Ausnahmebehandlung 14

Arten von Ausnahmen Systemausnahmen Werden automatisch ausgelöst (illegale Instruktionen) Beispiele ArithmeticException (bei Division durch 0) NullPointerException (Zugriff auf null-zeiger) ArrayIndexOutOfBoundsException (Arrayindex außerhalb des erlaubten Bereichs) Können abgefangen werden, müssen es aber nicht (meist Programmierfehler)! Programmende ohne Abfangen = unchecked exceptions (catch-blöcke werden nicht überprüft beim Kompilieren). Benutzerausnahmen Müssen explizit vom Programmierer ausgelöst werden. throw - Anweisung Java-Bibliothek enthält schon häufige Fehlerarten. z.b. java.io.ioexception Zusätzlich kann man eigene Klassen implementieren und verwenden. Müssen immer abgefangen werden! = checked exceptions (catch-blöcke werden nicht überprüft). Programmiermethodik - Ausnahmebehandlung 15

Exception-Klassen Ausnahmen sind in Java Objekte. Enthalten Informationen über die aufgetretenen Fehler. Bieten Methoden an, um auf die Informationen zuzugreifen. Alle Ausnahmen sind in einer Klassenhierarchie gruppiert. Allgemeine Klasse Exception Diverse Unterklassen für spezifische Ausnahmen Dient zur Differenzierung Eine catch-klausel, die eine Klasse E behandeln kann, kann auch alle Unterklassen von E behandeln. Programmiermethodik - Ausnahmebehandlung 16

Hierarchie Oberste Klasse ist java.lang.throwable Enthält Methoden zur Fehleranalyse String getmessage() (Text bei Ausnahme) String tostring() (Klassenname + getmessage()) void printstacktrace() Methoden-Aufrufe auf Stack verwaltet Konstruktoren (leer, mit Fehlermeldung, ) Unterklassen java.lang.error Irreparable Fehler java.lang.exception Fehler, die sinnvoll behandelt werden können Es existieren schon bestimmte Subklassen für die Fehlerbehandlung! Programmiermethodik - Ausnahmebehandlung 17

Hierarchie (Übersicht, teilweise) Programmiermethodik - Ausnahmebehandlung 18

Error Error sind Fehler, die mit der JVM in Verbindung stehen. Beispiel Zu wenig Speicher für die JVM bei der Objekterzeugung vorhanden - OutOfMemoryError Da die Fehler abnormales Verhalten anzeigen, müssen sie auch nicht mit einer catch-klausel aufgefangen werden Ein Auffangen macht wenig Sinn. Wie sollte man auf solch einen Fehler reagieren? Programmiermethodik - Ausnahmebehandlung 19

Exception-Hierarchie Exception RuntimeException ArithmeticException NullPointerException IndexOutOfBoundsException. IOException. InterruptedException MyException. Vordefinierte Ausnahmen Selbst definierte Ausnahmen Systemausnahmen (Unchecked Exceptions) Benutzerausnahmen (Checked Exceptions) Programmiermethodik - Ausnahmebehandlung 20

Eigene Klasse / Ausnahme auslösen Von der Klasse Exception ableiten class MyException extends Exception { } Hat nur einen Defaultkonstruktor Wenn man eine Nachricht mitgeben möchte: class MyException extends Exception { public MyException(){} public MyException(final String specialinfo){ super(specialinfo); } } Auslösen ( Werfen ) einer Ausnahme mit der throw Anweisung: throw new MyException(); throw new MyException("Falsche Eingabe"); Die throw-anweisung unterbricht den laufenden Code sofort! Siehe externes Beispiel ResourceLoader.java bzw. StackException.java Programmiermethodik - Ausnahmebehandlung 21

Weiterreichen von Exceptions Methoden müssen ihre Ausnahmen nicht lokal behandeln, sondern können sie auch weiterreichen. Der Benutzer einer Methode muss mit einer Exception- Signatur darauf hingewiesen werden. Form returntype name(parameterlist) throws exceptiontype1, exceptiontype2 z.b. int test(int x) throws IOException { } Zeigt dem Aufrufer an, dass eine bestimmte Ausnahme geworfen werden könnte. Sollte möglichst spezifisch sein. Wird vom Compiler überprüft (checked exception). Fehlende oder falsche Angaben werden gemeldet. Programmiermethodik - Ausnahmebehandlung 22

Weiterreichen von Exceptions (2) Ausnahmen können durchgereicht werden. Methode generiert die Ausnahme nicht selbst, sondern ruft eine Methode auf, die eine Ausnahme generiert. Eine Methode muss in ihrer Signatur angeben: Die Typen der selbst ausgelösten Ausnahmen Die Typen aller Ausnahmen aller aufgerufenen Methoden (RuntimeException und Subklassen davon müssen nicht angegeben werden) Compiler stellt sicher, dass keine Ausnahme einer untergeordneten Methode übersehen wird. Siehe Beispiel ArrayStack.java und StackTest.java Programmiermethodik - Ausnahmebehandlung 23

Überladen und Überschreiben Überladen Exception-Signaturen überladener Methoden sind völlig unabhängig. Unterschiedliche Exception-Signaturen reichen nicht aus, um Methoden zu überladen. Überschreiben Exception-Signatur darf bei der Redefinition der Methode dieselben Exceptions wie Oberklasse auslösen Exceptions spezialisieren Exceptions weglassen Bei der Redefinition dürfen in der Exception-Signatur alle Typen aufscheinen, die zu irgendeinem Typ in der Signatur irgendeiner direkten oder indirekten Basisklassenmethode kompatibel sind (auch mehrere Subklassen für eine Exceptionklasse). Siehe externes Beispiel Stack.java bzw. ArrayStack.java Programmiermethodik - Ausnahmebehandlung 24

finally Der try catch-block kann nach den catch-klauseln eine finally-klausel enthalten. Die Anweisungen in der finally-klausel werden immer als Abschluss der try-anweisung ausgeführt, egal ob eine Ausnahme auftrat oder nicht. Hat den Zweck Arbeiten, die im try - Block begonnen wurden, sauber abzuschließen. Beispiel Im try-block wird eine Datei geöffnet. Die Datei muss wieder geschlossen werden (egal ob bei der Verarbeitung der Daten ein Fehler auftritt oder nicht). Hinweis: In Java 7 gibt es noch eine andere Möglichkeit. Diese wird im Foliensatz über Streams noch ausführlich besprochen. Auch bei verschachtelten try-anweisungen möglich! Programmiermethodik - Ausnahmebehandlung 25

finally (Abarbeitung) try { } catch (E1 e){ } catch (E2 e){ } finally { } Normalfall Ausnahmefall E1 Ausnahmefall E3 E3 wird in der aufrufenden Methode behandelt. Siehe externes Beispiel FinallyTest.java Programmiermethodik - Ausnahmebehandlung 26

Exception-Chaining Wenn Methoden Ausnahmen immer weiterreichen Sehr lange Exception-Signaturen Detailfehler auf niederer Ebene müssen an ganz anderer Stelle behandelt werden. Änderungen in der Exception-Signatur würden viele Veränderungen nach sich ziehen. Lösung Exception-Chaining Mehrere Ausnahmen untergeordneter Aufrufe werden aufgefangen. Die Ausnahmen werden zusammengefasst und in einer neuen Ausnahme weitergegeben. Programmiermethodik - Ausnahmebehandlung 27

Exception-Chaining (Allgemeines Schema) Allgemeines Schema try { }catch(e1 ex){ throw new MyException(ex); }catch(e2 ex){ throw new MyException(ex); } Ausnahme vom Typ E1 wird in eine Ausnahme vom Typ MyException verpackt. Programmiermethodik - Ausnahmebehandlung 28

Chaining bei eigenen Ausnahmen Entsprechende Konstruktoren implementieren Exception-Klasse gibt Beispiele für solche Konstruktoren: Exception(String message, Throwable cause) Exception(Throwable cause) Beispiel für Konstruktor für die MyException-Klasse: MyException(Throwable cause){super(cause);} Oder initcause-methode verwenden: catch (E1 ex) { MyException m = new MyException(); m.initcause(ex); throw m; } Siehe externes Beispiel ResourceLoader.java Programmiermethodik - Ausnahmebehandlung 29

Konstruktoren und Ausnahmen Ausnahmen können auch in Konstruktoren verwendet werden. Fehler beim Anlegen eines Objekts sollten vermieden werden. Objekt könnte in einem inkonsistenten Zustand sein. Der Konstruktor sollte die Ausnahme weiterreichen (throws). Aufrufende Methode kann dann entsprechend auf die gescheiterte Erzeugung des Objekts reagieren. Aber: Vorsicht bei finally! wird immer aufgerufen Programmiermethodik - Ausnahmebehandlung 30

Debugging von Ausnahmen Die Klasse Throwable liefert einige Methoden (implementierte Klasse). printstacktrace Liefert den Aufrufstack der Methoden. getstacktrace Erlaubt Zugriff auf Stack-Trace-Elemente. getmessage Liefert den Fehlerstring einer Ausnahme (wenn vorhanden). Anwendung (Beispiel) catch(myexception e){ e.printstacktrace(); } Siehe externes Beispiel FinallyTest.java Programmiermethodik - Ausnahmebehandlung 31

Java 7 - Multi-Catch (1) Manchmal möchte man mehrere Ausnahmetypen gleichartig behandeln und dafür nur eine catch-klausel verwenden. In Java 7 ist nun das Fangen mehrerer Ausnahmen mit nur einem catch-block möglich. Wird als Multi-Catch bezeichnet. Bei der Aufzählung werden die einzelnen Ausnahmen mit getrennt. Die Variable (im unteren Beispiel e) ist implizit final. Beispiel: try { Hier können sowohl Ausnahmen vom Typ MyException als auch vom Typ OtherException geworfen werden. } catch (MyException OtherException e) { } Gemeinsame Behandlung der unterschiedlichen Ausnahmen Programmiermethodik - Ausnahmebehandlung 32

Java 7 - Multi-Catch (2) Die Abarbeitung erfolgt wie bei mehreren catch-blöcken. Neben den Standard-Tests kommen neue Überprüfungen hinzu, ob etwa die exakt gleiche Ausnahme zweimal in der Liste ist oder ob es Widersprüche durch Mengenbeziehungen gibt. Umsortierung der Ausnahmetypen bringt in diesem Fall nichts! Beispiel für fehlerhaftes Multi-Catch (Mengenbeziehung): try { new RandomAccessFile("", ""); } catch (FileNotFoundException IOException e) { } Programmiermethodik - Ausnahmebehandlung 33

Java 7 Final Rethrow (1) Immer dann, wenn in einem catch-block ein throw stattfindet, ermittelt der Compiler die im try-block tatsächlich aufgetretenen geprüften Ausnahmetypen. Der im catch genannte Typ für das rethrow wird nicht berücksichtigt. Statt dem gefangenen Typ wird der Compiler den durch die Codeanalyse gefundenen Typ beim rethrow melden. Allgemeine Exception catchen, spezielle Exception throwen. Programmiermethodik - Ausnahmebehandlung 34

Java 7 Final Rethrow (2) class Exception_A extends Exception {} class Exception_B extends Exception {} public class Test1 { private void method_a() throws Exception_A {} private void method_b() throws Exception_B {} private static void method_c() throws Exception_A, Exception_B { Test1 l = new Test1(); try { l.method_a(); l.method_b(); } catch (Exception x) { throw x; } } } Programmiermethodik - Ausnahmebehandlung 35

Allgemeine Regeln Behandlung Behandle auftretende Ausnahmen, wenn dies sinnvoll möglich ist. Propagiere im Zweifelsfall Ausnahmen an höhere Aufrufebenen weiter. Dabei sollte aber immer ein möglichst aussagekräftiger Ausnahmetyp gewählt werden! Art der Ausnahme Wenn ein Aufrufer eine außergewöhnliche Situation behandeln kann, so sollte eine Benutzerausnahme (checked exception) geworfen werden. Ist ein Aufrufer nicht in der Lage, eine Fehlersituation zu korrigieren, so verwendet man eine Systemausnahme (unchecked exception). Programmiermethodik - Ausnahmebehandlung 36

Verwendung von Ausnahmen (1) Ausnahmen werden oft für Preconditions verwendet. Preconditions beziehen sich meist auf Parameter. Die Parameter dürfen meist nicht beliebige Werte annehmen. Ohne Überprüfung kann ein Objekt in einem falschen (inkonsistenten) Zustand sein. Verwendung von try-catch try-catch findet sich meist in übergeordneten Methoden. Je mehr über den aktuellen Programmzustand vorhanden ist, desto besser lässt sich angemessen auf einen Fehler reagieren. Programmiermethodik - Ausnahmebehandlung 37

Verwendung von Ausnahmen (2) Eigene Klassen definieren Trade-Off Viele Einzelklassen Feingranulare Behandlung, aber lange Exception-Signaturen oder catch-listen Wenige Einzelklassen Weniger Abfragen, aber schlechte Differenzierung Hierarchien aufbauen (Subklassen von Exception oder RuntimeException) Spezielle Klassen für differenzierte Fehlersituationen Spezielle Klassen nach Fehlerart gruppieren und mit gemeinsamen Basisklassen versehen Detaillierte Ausnahmen anbieten Ausnahme beinhalten weitere Objektvariablen, Beim Werfen der Ausnahme werden diese Objektvariablen belegt (z.b. mit den falschen Parameterwerten etc.) Damit kann der Programmierer auf mehr Information zugreifen! Wann von RuntimeException ableiten? Wenn der Benutzer der Klasse das Problem von vornherein vermeiden kann! RuntimeExceptions stehen meist mit Programmier- und Denkfehlern in Zusammenhang. Programmiermethodik - Ausnahmebehandlung 38

Verwendung von Ausnahmen (3) Ausnahmen sollten auch dokumentiert werden Auszug aus "How to Write Doc Comments for the Javadoc Tool": Programmiermethodik - Ausnahmebehandlung 39

Verwendung der verschiedenen Basisklassen Abfangen in catch-klauseln Error - nein Exception - nein (würde alle Subklassen abfangen), nur Subklassen davon! RuntimeException nein, eigentlich ein Fehler im Programm, der behoben werden sollte! Werfen Error - ja, eventuell auch eigene Unterklasse! Exception nein (zu allgemein), nur Unterklassen! RuntimeException ja, mit einer eigenen oder einer entsprechenden Subklasse! Programmiermethodik - Ausnahmebehandlung 40

Ausnahmen Don't Niemals eine Ausnahme verschwinden lassen! try {... } catch (MyException e) {} Fehler verschwinden nicht von selbst! Programm wird möglicherweise nicht richtig funktionieren (inkonsistente Daten etc.). Ausnahmen sollten niemals Kontrollstrukturen ersetzen!!! Z.B. bei einem Arraydurchlauf nicht auf die Länge überprüfen, sondern auf Ausnahme warten und dann abfangen. Rückgabe von null statt einer Ausnahme im Fehlerfall Ausnahmen müssen behandelt werden, null kann ignoriert werden! Rückgabe von null ist nur in sehr wenigen Fällen sinnvoll. Muss in der aufrufenden Methode separat behandelt werden. Programmiermethodik - Ausnahmebehandlung 41

Assertions

Assertions allgemein Eine Assertion (Zusicherung) ist ein boolescher-ausdruck, der immer zutreffen muss. Assertions werden beim Programmablauf von der JVM überwacht. Programmabbruch, wenn eine Assertion nicht zutrifft (Error)! Assertions sind einfache Anweisungen. Form assert ausdruck; assert ausdruck:string; ausdruck muss immer true liefern, string enthält eine Fehlermeldung. Beispiele assert a <= b && b <= c; assert x >= 0: "Positives x"; Programmiermethodik - Ausnahmebehandlung 43

Arbeitsweise Assertions werden zur Laufzeit ausgewertet. Wenn das Ergebnis false ist, stoppt das Programm mit einem AssertionError. Die nachfolgenden Anweisungen werden nicht mehr ausgeführt. Bei Abbruch wird Information über den Ort der gescheiterten Assertion ausgegeben. Programmiermethodik - Ausnahmebehandlung 44

Aktivierung Assertions kosten Rechenzeit. Sie können zur Laufzeit wahlweise aktiviert werden. Deaktiviert sind sie automatisch! Programm muss nicht neu übersetzt werden. Aktivierung im Programm Test (enable assertions) java ea Test Deaktivierung (default, muss nicht angeführt werden; disable assertions) java da Test In Eclipse Unter Run->RunConfigurations Reiter Arguments auswählen. -ea im Feld Vm arguments angeben. Normalerweise während der Entwicklungszeit! Programmiermethodik - Ausnahmebehandlung 45

Selektive Aktivierung Assertions können auch selektiv auf der Ebene von Klassen und Packages getrennt aktiviert werden. Assertions in Klasse classname aktivieren: -ea:classname Assertions in Package packagename (3 Punkte müssen angegeben werden): -ea:packagename Mehrere Schalter erlaubt: java -ea:project2 -da:project2.datastore -ea:project2.datastore.store Test Programmiermethodik - Ausnahmebehandlung 46

Einsatz von Assertions Sind für Bedingungen geeignet, deren Einhaltung vom Programm selbst garantiert werden kann. z.b. am Ende einer Methode Rechenergebnisse absichern. Nicht für Bedingungen geeignet, die von irgendwelchen äußeren Einflüssen abhängen. z.b. am Anfang einer öffentlichen Methode die Werte der Parameter überprüfen. Programmiermethodik - Ausnahmebehandlung 47

Anwendung Überprüfung von Parametern, die an nicht-öffentliche Methoden übergeben werden (nur falsch, wenn das eigene Programm fehlerhaft ist). Verwendung in Postconditions, die am Ende einer Methode erfüllt sein müssen. Überprüfung von Schleifeninvarianten. Markierung von "toten Zweigen" in if- oder case- Anweisungen, die normalerweise niemals erreicht werden sollten (Assertion mit false als Argument). Programmiermethodik - Ausnahmebehandlung 48

Beispiel public class AssertionTest { private static int max(final int x, final int y) { return x < y? x : y; } private static int min(final int x, final int y) { return x > y? x : y; } Denkfehler - Falsche Implementierungen! Hier sollten korrekte Werte in maximum und minimum vorhanden sein! } private static void test(final int x, final int y) { final int maximum = AssertionTest.max(x, y); final int minimum = AssertionTest.min(x, y); assert maximum >= minimum : "Maximum kleiner als Minimum"; System.out.println(maximum + " " + minimum); } public static void main(final String[] args) { AssertionTest.test(10, 15); AssertionTest.test(8, 3); AssertionTest.test(2, 2); java AssertionTest 10 15 3 8 2 2 } java ea AssertionTest Exception in thread main java.lang.assertionerror: Maximum kleiner als Minimum at AssertionTest.test(AssertionTest.java:13) at AssertionTest.main(AssertionTest.java:18) Programmiermethodik - Ausnahmebehandlung 49

Private Invarianten-Methoden (1) Objektvariablen dürfen meist nicht beliebige Werte annehmen. Es gelten bestimmte Bedingungen. Bedingungen werden als Klasseninvarianten bezeichnet. Diese Bedingungen gelten für jedes Objekt der Klasse. Bedingungen können während der Ausführung einer Methode kurzfristig verletzt werden. Vor dem Aufruf und nach der Rückkehr müssen die Invarianten immer gelten. Klasseninvarianten können komplex sein. Mehrere Objektvariablen müssen berücksichtigt werden. Test kann aufwändig sein. Muss möglicherweise an vielen Stellen erfolgen. Programmiermethodik - Ausnahmebehandlung 50

Private Invarianten-Methode (2) Private Invarianten-Methoden Test der Klasseninvarianten wird in eine boolean-methode gegeben. Enthält keine Assertions. Wird in anderen Methoden bei Assertions verwendet. Beispiel public class Rational { private int denom; private boolean invariantholds() { return denom!= 0; } public void reduce() { assert this.invariantholds(); } public void invert() { assert this.invariantholds(); } } Programmiermethodik - Ausnahmebehandlung 51

Kompatibilität Assertions gibt es in Java erst seit der Version 1.4.! Voraussetzungen für Assertions: JDK-1.4.-Compiler 1.4.-kompatibles Laufzeitsystem Programmiermethodik - Ausnahmebehandlung 52