Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester 2004 1 2 Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität.

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

der Universität Oldenburg
der Universität Oldenburg
Ein Beispiel in Java.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Kritische Betrachtung
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Abstrakte Klassen.
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Exceptions. import java.sql.*; public class MyException{ boolean b; Statement stat; public MyException(){ b = stat.execute("xyz"); } Beim Übersetzen dieses.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 4 Vererbung Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Java-AG Ausnahmebehandlung Gerhard Gröger.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
DVG Ausnahmen. DVG Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten.
DVG Ausnahmen1 Ausnahmen. DVG Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung / Geschichte Einführung / Geschichte Motivation Motivation Beispiel Beispiel Architektur / Komponenten Architektur / Komponenten Konfiguration.
Einführung in die Informatik II Entwurf durch Verträge 3. Teil
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
1. Verhalten der Objekte: Operationen Werden in den Klassen definiert Werden (i.d.R.) auf einem Objekt aufgerufen Wird das Empfängerobjekt genannt Weitere.
Grundlagen der Programmierung
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Grundlagen der Programmierung
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik I Thema 16: Ausnahmebehandlung.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Exception-Handling.
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Robuste Programme durch Ausnahmebehandlung
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Einführung in die Programmierung mit Java
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 11. Vorlesung WS 2001/2002.
Java-Kurs Übung zAusnahmebehandlung: Exceptions zEin-/Ausgabe yDatenströme.
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Vortrag Einführung in AspectJ. Gliederung 1 Einleitung 2 Querschnittsfunktionalitäten in AspectJ 2.1 Sprachelemente 3 Beispiel 4 Join Point Modell 5 Weaving.
Ausnahmen Exceptions Definition Ausnahmen erzeugen Ausnahmen abfangen
1. Die rekursive Datenstruktur Liste 1
Implementieren von Klassen
 Präsentation transkript:

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität München Sommersemester Juni 2004 Letzte Änderung: 2/26/2014 9:14 AM Einführung in die Informatik II Ausnahmen

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Überblick v Ausnahme: Ein Ereignis, das den normalen Programmfluss ändert v Ausnahmen in Java v Modellierung von Ausnahmen v Programmierung von Ausnahmen v Dokumentation von Ausnahmen v Behandlung von Vertragsbrüchen mit Ausnahmen

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ziel der Vorlesung v Sie verstehen die Konzepte der Ausnahmen und der Ausnahmebehandlung. v Sie können Ausnahmen modellieren, als Unterklassen von Java-Ausnahmen implementieren und in Javadoc dokumentieren. v Sie verstehen, wie man Ausnahmebehandlung implementiert. Sie sind in der Lage, den try/catch/finally -Rahmen in Java zu benutzen. v Sie verstehen, wie man Verträge des Spezifikationsmodells mit Hilfe von Ausnahmen im Quellprogramm formulieren kann.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Organisatorisches Am 15. Juni ist eine ganztägige Veranstaltung im Hoersaal I Feierstunde 80. Geburtstag Prof. F.L. Bauer Die Info II-Vorlesung wird deshalb in den MW 0001 verlegt. Dienstag, 15. Juni 2001, 12:15-13:45 Info II-Vorlesung im MW 001.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zentralübung v Dienstag 8.Juni Hörsaal I, 14: :00 v Dienstag 15. Juni MW 0001, 14:15-15:00 v Thema: Beobachtermuster v Materialen: v Dort liegen in Beobachtermuster zwei Versionen von Bumpers: Beispiel für schlechte Programmierung: Initial Instruments Beispiel für gute Programmierung: Observer Pattern v Laden Sie sich beide Beispiele runter. v Unsere Aufgabe in den nächsten 2 Zentralübungen ist es das Muster und den Code zu verstehen, eine neue Sicht hinzuzufügen.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zentralübung: Beispiele für neue Sichten v Kompass, der die Richtung anzeigt v Benzinanzeige v Batterieanzeige v ….. v werden Sie erfinderisch!

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Fehlerbehandlung in Software-Systemen v Einer der größten Problembereiche beim Entwurf von Software- Systemen ist der Umgang mit möglichen Fehlern. Beim Entwurf von Software müssen Sie sich immer die folgenden 2 Fragen stellen: Was kann falsch laufen? Was mache ich, wenn etwas falsch läuft? v Im Kontext von Verträgen: Was ist, wenn der Vertrag falsch formuliert worden ist, oder wenn es gar keinen Vertrag gibt? Dies kann bereits zur Entwicklungszeit oder erst zur Laufzeit erkannt werden Was ist, wenn der Vertrag nicht eingehalten wird? Fallunterscheidung: Kunde vs Anbieter Was mache ich mit einem gebrochenen Vertrag? Alternativen: Abbrechen oder Weiterlaufen

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public int mittelwert(int arr[], int N) { int avg = 0; for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelwert() Schlechter Entwurf: Mittelwert() ist nicht vor N=0 geschützt. Beispiel eines Fehlers v Wenn N = 0, gibt es einen Fehler "Division-durch-0".

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class Statistik { public int mittelwert( int arr[], int N ) { int avg = 0; for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelwert() } // Statistik public class Statistik { public int mittelwert( int arr[], int N ) { int avg = 0; if (N <= 0) { System.out.println("FEHLER: Division durch 0"); System.exit(0); } for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelwert() } // Statistik Was machen wir mit Fehlern? Explizite Fehlerbehandlung im Programm v 1. Möglichkeit: Wir bauen die Fehlerbehandlung (hier: Fehlermeldung und Abbruch der Programmausführung) explizit in das Programm ein. v 95% aller existierenden Systeme arbeiten so:-(

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class Statistik { public int mittelwert(int arr[], int n) { int avg = 0; for (int k = 0; k < n; k++) avg += arr[k]; avg = avg / n; return avg; } // mittelwert() } // Statistik public class Statistik { /** n > 0 */ public int mittelwert(int arr[], int n) { int avg = 0; for (int k = 0; k < n; k++) avg += arr[k]; avg = avg / n; return avg; } // mittelwert() } // Statistik Was machen wir mit Fehlern? Spezifikation von Fehlersituationen (mit Verträgen) v 2. Möglichkeit: Wir schützen die Methode mit einem Vertrag v Ein Vertrag löst noch nicht das Problem der Fehlerbehandlung. Was machen wir bei Vertragsbruch?

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Was machen wir mit Vertragsbrüchen? v Wir verhindern sie (während der Entwicklung) Wir beweisen, dass es keinen Vertragsbruch geben kann (Zusicherungen, Programmverifikation Mitte Juni) Wir verbessern den Fehler im Modell (Revision des Entwurfs) oder im Quellprogramm (Testen & Debugging) v Wir leben mit ihnen (während der Laufzeit) Wir melden den Fehler und stoppen das System Mehr als 90% aller existierenden Programme machen das. Nicht zu empfehlen! Wir geben die Behandlung des Vertragsbruches an eine kompetente Stelle weiter (Ausnahmen) Info II, diese Vorlesung (Java unterstützt Ausnahmen). Das System wird von einem fehlerhaften Zustand auf einen korrekten Zustand (zurück-)gesetzt (auch defensive Programmierung genannt) Transaktionssysteme in Datenbanken ( Hauptstudium).

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ursachen für Vertragsbrüche v Wenn ein Vertrag gebrochen wird, kann es viele Ursachen geben: v Entwurfsfehler: Eine Invariante, Vor- oder Nachbedingung ist falsch formuliert Vertrag revidieren v Benutzungsfehler: Der Vertrag wird durch den Klassen-Benutzer verletzt: Die Evaluierung der Vorbedingung ergibt false. Aufruf verbessern v Implementierungsfehler: Der Methoden-Implementierer implementiert eine Methode, die die Nachbedingung verletzt: Die Evaluierung der Nachbedingung ergibt false. Implementierung verbessern v Wir konzentrieren uns auf Benutzungsfehler (Verletzung der Vorbedingung) und ihre Behandlung durch Ausnahmen.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ausnahmen v Definition Ausnahme (exception): Ein Ereignis, das die normale Ausführungsreihenfolge in einem System unterbricht, da ein Fehler aufgetreten ist. v Definition Ausnahmebehandlung (exception handling): Zur Behandlung von Ausnahmen wird zusätzlicher Programmcode bereit- gestellt. Wenn eine Ausnahme auftritt, wird die Programmausführung unterbrochen, um die Ausnahmebehandlung durchzuführen. v In Objekt-orientierten Sprachen (z.B. Java): Jede Ausnahme ist Instanz einer Klasse, d.h. sie hat Methoden und Attribute, die die Unterscheidung verschiedener Fehlerursachen erlauben. Wenn diese Unterscheidbarkeit wichtig ist, bezeichnen wir die Klasse der Ausnahme auch als Ausnahmetyp. Ein Ausnahme-Objekt enthält Einzelheiten über die Ursache seines Entstehens, die in der Ausnahmebehandlung genutzt werden können. v Bei der Modellierung sind einzelne Ereignisse meist nicht von Interesse. Hier steht der Begriff der Ausnahme daher eher für den Ausnahmetyp.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Taxonomie von Ausnahmen v Ein wesentlicher Teil des Entwurfs, besonders des detaillierten Entwurfs ist die Modellierung von Ausnahmen. v Ziel der Modellierung ist die Erstellung einer Taxonomie, die es ermöglicht, Ausnahmen aus der Anwendungsdomäne und der Lösungsdomäne zu behandeln. Ausnahmen sind gut für die Modellierung von potentiellen Problemen, z.B. bei der Eingabe von Werten in interaktiven Systemen. v Die Programmiersprache Java stellt eine (erweiterbare) Taxonomie für Ausnahmen in Form einer Klassenhierarchie bereit. Mithilfe von Spezialisierung können wir die modellierten Ausnahmen aus der Anwendungsdomäne und Lösungsdomäne als Unterklassen von dieser Ausnahmenhierarchie definieren.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Java's Ausnahmenhierarchie Throwable Error Exception RuntimeException Attributes Operations Benutzer-definierte Ausnahmen v Jeder Ausnahmetyp ist Unterklasse von Throwable. v Error enthält alle Ausnahmen, für die es keine Ausnahmebehandlung gibt bzw. für die keine sinnvolle Behandlung mehr möglich ist. v Exceptions sind Ausnahmen, für die es eine Ausnahmebehandlung gibt. Laufzeitfehler Benutzer-definierte Ausnahmen

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Spezifikation der Klasse Exception public class Exception extends Throwable { // Beschreibung der Ausnahme. // Voreinstellung abhängig vom Ausnahmentyp private String description; // Konstruktoren public Exception(); public Exception(String s); // s überschreibt // description // Methoden public String getMessage(); } Das Resultat von getMessage() ist die Beschreibung ( description ) der Ausnahme

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Spezialiserung bei Ausnahmen v Ausnahmen sind Klassen, wir können also Unterklassen definieren. v Beispiel: Beim Prüfen von Eingaben wollen wir oft sicherstellen, dass der eingegebene Wert kleiner als ein maximaler Wert ist. /** * Eine IntOutOfRange-Ausnahme tritt ein, wenn die eingebene * ganze Zahl einen bestimmten Wert bound überschreitet. */ public class IntOutOfRange extends Exception { public IntOutOfRange () {} public IntOutOfRange (int bound) { super("Der Eingabewert ist größer als " + bound); } Im Konstruktor von IntOutOfRange wird mit super() der Konstruktor der Superklasse, also der Konstruktor von Exception, aufgerufen.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester /** n > 0 */ public int mittelwert (int[] arr, int n) { int avg = 0; for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelWert() Erzeugung von Ausnahmen in Java Wenn eine Ausnahme eintritt, wird ein entsprechendes Ausnahme-Objekt "geworfen" ( throw ). v Diese Methoden-Implementierung ist noch nicht vollständig, denn die Ausnahme muss innerhalb der Methode behandelt werden, oder die Ausnahme muss vom Aufrufer der Methode behandelt werden. /** n > 0 */ public int mittelwert (int[] arr, int n) { int avg = 0; if (n <= 0) throw new Exception("Fehler: Division durch 0"); for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelWert()

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ausnahmebehandlung in Java: try - catch - finally Ein "Versuchs-Block" ( try{…} ) enthält Anweisungen, deren Ausführung möglicherweise eine Ausnahme verursachen kann. Mit einem Versuchs-Block signalisieren wir unsere Bereitschaft, eventuell auftretende Ausnahmen zu behandeln. Die eigentliche Ausnahmebehandlung fängt die von einer Anweisung im Versuchsblock geworfene Ausnahme und besteht aus einem oder mehreren "Fang-Blöcken" ( catch{…} ): Jeder Fang-Block ist für einen bestimmten Ausnahmetyp zuständig. Die Definition von Fang-Blöcken ähnelt der Definition von Methoden, und enthält einen formalen Parameter (oft e genannt). Der Typ des Parameters ist der Ausnahmentyp. Der "Final-Block" ( finally{…} ) macht die Aufräumarbeiten. Die Angabe eines Final-Blocks ist nicht zwingend vorgeschrieben. Ist ein Final-Block angegeben, so wird er nach dem Versuchsblock und der Ausnahmebehandlung ausgeführt, unabhängig davon, ob im Versuchs-Block eine Ausnahme erzeugt wurde oder nicht.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public int mittelwert( int arr[], int n ) { int avg = 0; try { if (n <= 0) throw new Exception("Fehler: Division durch 0"); for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; } catch (Exception e) {System.out.println(e.getMessage());} finally {} return avg; } // mittelWert() Wenn n<= 0 wahr ist, wird die Ausnahme instanziiert (new Exception) und geworfen (throw). Hier wird das Ausnahme-Objekt e an die Ausnahmebehandlung übergeben (catch). Der Final-Block (finally) könnte hier auch entfallen, da keine "Aufräumarbeiten" durchzuführen sind. Benutzung des try - catch - finally -Rahmens in Java Wir wissen, dass bei der Mittelwert-Berechnung eine Ausnahme erzeugt werden kann(falls n <= 0), die wir behandeln wollen (try)

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester try { if ( /* Überprüfung Invariante, Vor- oder Nachbedingung */ ) throw new ExceptionName1(); if ( /* Überprüfung Invariante, Vor- oder Nachbedingung */ ) throw new ExceptionName2(); // … weitere Überprüfungen } catch (ExceptionName1 ParameterName) { // Ausnahmebehandlung für ExceptionName1 } catch (ExceptionName2 ParameterName) { // Ausnahmebehandlung für ExceptionName2 } // …. weitere Ausnahmebehandlungen finally { // Aufräumarbeiten } Behandlung von mehr als einem Ausnahmetyp

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Deklaration von Ausnahmen v Methoden können die Ausnahmebehandlung an den Aufrufer der Methode delegieren. Alle von einer Methode erzeugbaren Ausnahmen müssen in der Signatur mit dem Schlüsselwort throws deklariert sein. v Allgemeine Form der Methodendeklaration: ErgebnisTyp f( Typ1 param_1, …, Typm param_m) throws Ausnahme_1,…, Ausnahme_n Die Ausnahmetypen Ausnahme_1, …, Ausnahme_n sind logisch gesehen zusätzliche Ergebnisparametertypen (zu ErgebnisTyp ) Die Signatur von f hat also m Formalparameter, n Ausnahmen und ein Ergebnis v Ausnahmen gehören zur Schnittstelle einer Klasse und sind deshalb auch Teil des Vertrages: Der Kunde darf nicht mit Ausnahmen überrascht werden, ohne zu wissen, wieso und woher sie kommen. Der Anbieter des Vertrages muss also in der Schnittstelle spezifizieren, welche Ausnahmen die Methoden seiner Klassen erzeugen können.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class Complex { private double Re; // Realteil private double Im; // Imaginärteil … public Complex divide (Complex d) if ((d.Re == 0.0) && (d.Im ==0.0)) … } Deklaration von Ausnahmen: Beispiel throws deklariert die Ausnahme DivisionbyZeroException throw erzeugt die Ausnahme DivisionbyZeroException public class Complex { private double Re; // Realteil private double Im; // Imaginärteil … public Complex divide (Complex d) throws DivisionbyZeroException { … if ((d.Re == 0.0) && (d.Im ==0.0)) … } public class Complex { private double Re; // Realteil private double Im; // Imaginärteil … public Complex divide (Complex d) throws DivisionbyZeroException { … if ((d.Re == 0.0) && (d.Im ==0.0)) throw new DivisionbyZeroException(); … }

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Deklaration von Ausnahmen: 2. Beispiel v Wenn wir in einer Methode andere Methoden aufrufen, müssen wir wissen, welche Ausnahmen diese werfen können. Diese Ausnahmen müssen wir entweder selbst behandeln oder an den Aufrufer unserer Methode weiterreichen (durch Deklaration). Beispiel: Die Methode readline() der Klasse BufferedReader kann die Ausnahme IOException werfen. public static void main(String[] args) throws IOException { BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String inputString = input.readLine(); } IOException muss deklariert werden... …denn readLine() kann sie werfen.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Geprüfte und Ungeprüfte Ausnahmen in Java v Java unterscheidet zwischen ungeprüften und geprüften Ausnahmen. v Ungeprüfte Ausnahme (unchecked exception): Eine Ausnahme, von der sich ein Programm normalerweise nicht erholen kann, und die man deshalb auch nicht prüfen muss. Alle Ausnahmen vom Typ Error v Geprüfte Ausnahmen (checked exception): Eine Ausnahme, von der sich ein Programm erholen kann, und die man deshalb behandeln muss: Alle Klassen vom Typ Exception. v Jede Regel hat eine Ausnahme: Obwohl RuntimeException eine Unterklasse von Exception ist, sind alle Ausnahmen vom Typ RuntimeException ungeprüfte Ausnahmen. RuntimeException wird implizit bei jeder Methodendefinition deklariert.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ungeprüfte Ausnahmen in Java v Ungeprüfte Ausnahmen heißen so, weil vom Java-Compiler nicht überprüft wird, ob sie deklariert sind. Die Klasse RuntimeException und alle ihre Unterklassen sind ungeprüfte Ausnahmen. Klassenhierarchie für RuntimeException : ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException NumberFormatExceptionObject ThrowableExceptionRuntimeException ArithmeticException ArrayStoreException ClassCastException IllegalArgumentException IllegalMonitorStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException SecurityException

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Ungeprüfte Ausnahmen in Java: Laufzeit-Fehler ArithmeticException ClassCastException IllegalArgumentException NumberFormatException IndexOutOfBoundsException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException NullPointerException Division durch Null oder ein anderes arithmetisches Problem Ungültige Typ-Konvertierung eines Objektes in eine Klasse, von der es keine Instanz ist. Methodenaufruf mit falschen Argumenten Illegales Zahlenformat (z.B. beim Methodenaufruf) Ein Reihungs-oder Zeichenkettenindex ist außerhalb der Grenzen Ein Index in einer Reihung ist kleiner als 0 oder als die Länge der Reihung Ein Zeichenkettenindex ist außerhalb der Grenzen Objektzugriff über null -Referenz

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Wann kommen ungeprüfte Ausnahmen vor? Beispiele (Java-Standardklassen) KlasseAufrufAusnahmeBeschreibung DoublevalueOf(String)NumberFormatExceptionString ist kein double IntegerparseInt(String)NumberFormatExceptionString ist kein int StringString(String)NullPointerExceptionString ist null indexOf(String)NullPointerExceptionString ist null lastIndexOf(String)NullPointerExceptionString ist null charAt(int)StringIndexOutOfBoundsExceptionint ist ungültiger Index substring(int)StringIndexOutOfBoundsExceptionint ist ungültiger Index substring(int,int)StringIndexOutOfBoundsExceptionint ist ungültiger Index

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Public class Statistik { public int mittelwert( int arr[], int n ) throws ArithmeticException { int avg = 0; if (n <= 0) throw new ArithmeticException("Fehler: Division durch 0"); for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelWert() public static void main(String[] args) { int numbers[] = {10, 20, 30, 30, 20, 10}; try { Statistik stat = new Statistik(); System.out.println( "Mittel: " +stat.mittelwert(numbers,0)); } catch (ArithmeticException e) { System.out.println(e.getMessage() ); System.exit(0); } } // main() } // Statistik Hier wird die Ausnahme instanziiert und geworfen... … und durch diesen Fang-Block behandelt. Beispiel: Ausnahme-Erzeugung und Behandlung in Java Der Aufruf von e.getMessage() ergibt als Resultat die Beschreibung des Ausnahme-Objekts e

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Voreingestellte Behandlung von Ausnahmen in main() Wenn es im Hauptprogramm ( main() -Methode) keinen Fang-Block für eine Ausnahme gibt, dann behandelt das Laufzeitsystem von Java (die sog. Java Virtual Machine (JVM)) die Ausnahme. public class Statistik { public int mittelWert(int arr[], int N) { int avg = 0; if (N <= 0) throw new ArithmeticException(" Fehler: Mitteln von 0 Elementen "); for (int k = 0; k < N; k++) avg += arr[k]; avg = avg / N; return avg; } // mittelWert() public static void main(String args[]) { int numbers[] = {10, 20, 30, 30, 20, 10}; Statistik stat = new Statistik(); System.out.println( "Mittel: " + stat.mittelWert(numbers, 0)); } // main() } // Statistik Kein Fang-Block für ArithmeticException, also übernimmt die JVM die Behandlung. Ausgabe des Programms: java.lang.ArithmeticException: Fehler: Mitteln von 0 Elementen at Statistik.mittelWert(Statistik.java:5) at Statistik.main(Statistik.java:14) at com.mw.Exec.run(JavaAppRunner.java:47) Hier wird die Ausnahme instanziiert und geworfen...

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Dokumentation von Ausnahmen in Javadoc v Ausnahmen dokumentieren wir in Javadoc class-name description -Tag muss vor der Methode stehen, für die die Ausnahme deklariert wird. class-name muss ein voll qualifizierter Name sein. v Der Name der Ausnahme kommt in eine "Throws"-Sektion. Eine "Throws"-Sektion wird nur für Methoden erzeugt, für die eine oder mehrere Ausnahmen deklariert sind.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Public class Complex { private double Re; // Realteil private double Im; // Imaginärteil … /** * Komplexe Division. d Divisor: Für Division muss d != 0 sein */ public Complex divide (Complex d) throws DivisionByZeroException { if (d.Re==0.0 && d.Im ==0.0) throw new DivisionByZeroException(); … } Beispiel: Dokumentation von Ausnahmen Deklaration der Ausnahme DivisionByZeroException Public class Complex { private double Re; // Realteil private double Im; // Imaginärteil … /** * Komplexe Division. d Divisor: Für Division muss d != 0 sein DivisionByZeroException: Wird erzeugt, wenn d == 0 */ public Complex divide (Complex d) throws DivisionByZeroException { if (d.Re==0.0 && d.Im ==0.0) throw new DivisionByZeroException(); … }

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Implementation von Verträgen mit Ausnahmen 6/3/ OCL-Spezifikations-Operationen implementieren wir in Java 2. Wir untersuchen alle Vor- und Nachbedingungen nach OCL- Prädikaten. 3. Für jedes neue OCL-Prädikat P, das wir in den Vor- und Nachbedingungen finden......deklarieren wir eine Java-Ausnahme J....schreiben wir eine Anweisung, die die Gültigkeit des Prädikats überprüft: Bei Vorbedingungen kommt die Überprüfung an den Anfang des Methoden-Rumpfes Bei Nachbedingungen kommt die Überprüfung an das Ende des Methoden-Rumpfes...wird für die Überprüfung das OCL-Prädikat in einen booleschen Ausdruck B übersetzt....werfen wir die zugehörige Ausnahme J, wenn ( B == false) wahr ist.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public boolean contains (int key){... } public AVLNode find (int key) {... } /** */ public void delete (int key) {... } } // AVLTree public class AVLTree { private AVLNode root; /** */ public boolean isEmpty () { return (root == null); } /** */ public void insert (int key) {... } Beispiel: Vertrag für AVL-Bäume public class AVLTree { private AVLNode root; /** result = root->isEmpty */ public boolean isEmpty () { return (root == null); } /** contains(key) = false contains(key) = true root.isAVL() = true */ public void insert (int key) {... } public boolean contains (int key){... } public AVLNode find (int key) {... } /** contains(key) = true root.isAVL() = true */ public void delete (int key) {... } } // AVLTree

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Implementation von isAVL() // Java-Implementierung der OCL-Spezifikationsoperation private Boolean isAVL(AVLNode n) { if (n.leftChild.isEmpty() && n.rightChild.isEmpty()) return true; else if (n.leftChild.isEmpty()) return ((abs(n.hdiff) <= 1) && isAVL(n.rightChild)); else if (n.rightChild.isEmpty()) return ((abs(n.hdiff) <= 1) && isAVL(n.leftChild)); else return ((abs(n.hdiff) <= 1) && isAVL(n.leftChild) && isAVL(n.rightChild)); } Bemerkung: Bei der Berechnung von hdiff wird die Höhe eines leeren Baum auf -1 festgelegt.

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Beispiel: Implementation von delete() public void delete (int key) throws NotContained, NotAVLTree { if (not contains(key)) throw NotContained("Element " + key + " ist nicht im Baum"); if (not isAVL(root)) throw NotAVLTree("Der Baum ist gar kein AVL-Baum"); … // Der eigentlich Rumpf der delete() Operation…. } // delete() Deklaration von 2 Ausnahmen: NotContained und NotAVLTree /** contains(key) = true root.isAVL() = true NotContained wird erzeugt,wenn key nicht im Baum ist. NotAVLTree wird erzeugt,falls Baum kein AVL-Baum ist. */ public void delete (int key) throws NotContained, NotAVLTree { if (not contains(key)) throw new NotContained("Element " + key + " ist nicht im Baum"); if (not isAVL(root)) throw new NotAVLTree("Der Baum ist gar kein AVL-Baum"); … // Der eigentlich Rumpf der delete() Operation…. } // delete()

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Beispiel: Ausnahmebehandlung für delete() public void myDelete (AVLtree tree, int key) { try { tree.delete(key); } catch (NotContained e) { Die Ausnahmen NotContained und NotAVLTree müssen nicht mehr deklariert werden. v Mit den Ausnahmen wird die Behandlung des Vertragsbruches an den Benutzer weitergegeben. v Im Falle verletzter Vorbedingungen ist der Benutzer in der Regel auch die kompetente Stelle, um adäquat zu reagieren. Im Beispiel wird der Aufruf von delete() in der Methode myDelete() in einen try - catch -Block eingebettet. catch (NotAVLTree e) { // Dieser Vertragsbruch deutet auf tiefe Inkonsistenzen hin. // Eine Behandlung ist sicherlich schwierig... // Code zur Behandlung von NotAVLTree } } // myDelete() // Dieser Vertragsbruch ist harmlos, wenn es nur darauf // ankommt, dass key nicht mehr im Baum enthalten ist. // Dann ist hier gar nichts zu tun. Er kann aber auf // Inkonsistenzen hinweisen (wenn key im Baum enthalten // sein müsste). Dann ist hier Ursachenforschung nötig. }

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Heuristiken für Entwurf von Ausnahmen v Defensiver Entwurf: Versuchen Sie potentielle Probleme zu sehen, die die normale Folge von Ereignissen verändern. Ein guter Ausgangspunkt sind Anwendungsfälle. Spezielle Anwendungsfälle sind gute Kandidaten für Ausnahmen. Auch die inkorrekte Eingabe von Werten bei interaktiven Systemen lässt sich oft gut als Ausnahme modellieren. v Lokale Behandlung: Versuchen Sie, Ausnahmen möglichst lokal, d.h. "in der Nähe" ihres Auftretens, zu behandeln. Ausnahmen in Klassenbibliotheken: Schreiben Sie auch in der main() -Methode Fang-Blöcke für alle Ausnahmen, die Methoden aus Klassenbibliotheken werfen könnten, sonst überlassen Sie Ihr Schicksal den oft unverständlichen Fehler- Beschreibungen der JVM. v Ausnahmen beschreiben Ausnahme-Situationen: Benutzen Sie Ausnahmen nicht für die Behandlung von "normalen" Situationen ( Vorlesungsblock "Ereignis-basierte Programmierung")

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zusammenfassung v Ausnahmen sind Objekte (Instanzen von Ausnahmetypen/-klassen) Behandlung von Ausnahmen: try - catch - finally -Rahmen v Geprüfte und ungeprüfte Ausnahmen: Alle geprüften Ausnahmen müssen deklariert oder behandelt werden. Benutzer-definierte Ausnahmen sind normalerweise Spezialisierungen der Klassen Exception v Ausnahmen sind ein gutes Werkzeug, um die Verletzung von Verträgen während der Programmausführung zu melden bzw. zu behandeln.