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