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 Übersicht • Besprechung der Übungsaufgabe • Ausnahmebehandlung – Modellierung von Ausnahmezuständen – Die try-catch-Anweisung T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 2 Übungsaufgabe vom 16. 1. • Implementieren Sie die Klassen Figur, Dreieck, Ellipse und Trapez aus dem Beispiel auf Folie 9. Figur soll eine abstrakte Klasse sein. • Erweitern Sie jede der vier Klassen um die Methode umfang(). Diese ist bei Figur abstrakt. • Erzeugen Sie ein Array, das Dreiecke, Ellipsen und Trapeze enthält. • Berechnen Sie die Summe der Umfänge aller geometrischen Figuren im Array. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 3 1. Lösungsschritt: Implementierung Figur fläche() ausgeben() Dreieck seite1 : float seite2 : float seite3 : float fläche() ausgeben() Ellipse radius1 : float radius2 : float fläche() ausgeben() Kreis radius : float fläche() ausgeben() Rechteck breite : float höhe : float fläche() ausgeben() Trapez grundlinie1 : float grundlinie2 : float höhe : float fläche() ausgeben() T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 4 2. Lösungsschritt: Erweiterung um Umfang • Erweiterung der Klasse Figur.java trivial • Umfang eines Dreiecks, das durch seine drei Seitenlängen spezifiziert ist: – trivial (Addition der Seitenlängen) • Umfang eines Trapezes, das durch die vier Seitenlängen gegeben ist: – trivial (Addition der Seitenlängen) • Umfang einer Ellipse: – schwierig: wird durch ein elliptisches Integral berechnet, das durch keine elementare Formel berechnet werden kann. – Lösung: Näherungsformel (z.B. aus Bronstein et. al. 1996: Taschenbuch der Mathematik): U 1,5(r1 r2 ) r1r2 T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 5 Ergänzung zum 2. Lösungsschritt • Heutzutage reicht oftmals bereits ein Blick ins Internet, um bestimmte Fachfragen zu beantworten • Beispiel: Suchmaschine http://www.google.de Eingabe: Umfang Ellipse • 1. Treffer zeigt auf: http://www.mathematik-online.de/F57.htm (dort wird sogar die Herleitung der Näherungslösung aus dem Integral erläutert) • Aber: Kein Treffer bedeutet nicht, dass es keine Lösung gibt!!! T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 6 3. Lösungsschritt: Array mit Figuren • Für das Hauptprogramm, das das Array mit den Figuren erzeugt, sollte eine eigene Klasse z.B. namens FigurenArray angelegt werden. – Man könnte die Methode main() zwar in eine der Klassen Trapez, Dreieck oder Ellipse hineinsetzen, jedoch sind alle drei Klassen von der Modellierung her gleichberechtigt und stellen im Prinzip nur einfache „Komponenten“ dar. • ein fremder / neuer Benutzer der Klassen müsste raten, von welcher Klasse er main() starten soll – Wenn Trapez, Dreieck oder Ellipse ein Hauptprogramm (Methode main()) enthalten, sollte es ausschließlich zur Funktionsüberprüfung der jeweiligen Klasse dienen. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 7 Ausnahmesituationen in Java Eine Ausnahme (engl. Exception) ist ein Ereignis, das während der Ausführung des Programms auftritt, und den normalen Fluss der Befehle unterbricht. Beispiele für Ausnahmesituationen: • • • • bei Berechnungen Division durch Null Mangel an Speicherplatz Zugriff auf Array-Elemente über die Obergrenze hinaus Schreib-/Lesefehler bei Ein- und Ausgabeoperationen – – – – Diskette defekt Netzwerkverbindung zusammengebrochen Festplatte voll zu öffnende Datei nicht vorhanden usw. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 8 Ausnahmebehandlung in Java (I) • Java unterstützt explizite Ausnahmebehandlung: – systematische und übersichtliche Trennung von normalem und fehlerbehandelndem Code • Methoden können angeben, ob sie bzw. der in ihnen enthaltene Programmcode Ausnahmesituationen feststellen bzw. auslösen können. • Im Falle einer Ausnahme wird ein sog. Exception-Objekt erzeugt und an den Aufrufer der Methode übergeben • Eine Exception kann als ein durch eine Datenstruktur repräsentiertes Ereignis angesehen werden – Im Falle einer Ausnahmesituation wird diese mit Hilfe der Datenstruktur der Exception gemeldet. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 9 Java-Exceptions • Exceptions sind in Java als Klasse realisiert und zwar als Unterklasse der Klasse Throwable. Throwable (from lang) Exception (from lang) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 10 Java-Exceptions: Spezialisierungen • Ausschnitt aus der Klassenhierarchie unterhalb der Klasse Exception: Exception (from lang) ArrayIndexOutOfBoundsException IOException ArithmeticException (from lang) (from io) (from lang) FileNotFoundException (from io) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 11 Ausnahmebehandlung in Java (II) • Ausnahmebehandlung wird in Java über die try-Anweisung realisiert, die aus einem try-Block, einem oder mehreren catchKonstrukten und optional einem finally-Konstrukt bestehen muss. • Syntax: try { ... } Hier steht der Programmcode, in dem Fehler auftreten können catch (Exceptiontyp1 name1) { ... } catch (Exceptiontyp2 name2) { ... } finally { ... } Wird durchlaufen, egal ob ein Fehler auftrat oder nicht. Hier werden Fehler der Art Exceptiontyp1 abgefangen Hier werden Fehler der Art Exceptiontyp2 abgefangen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 12 Übung im GIS-Labor • Machen Sie folgendes Programm mittels try {...} catch (Exception e) {...} absturzsicher! class Ereignis1 { public static void main (String args[]) { int a; int b = 0; a = 10/b; System.out.println("Programmende wurde erreicht!"); } } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 13 Ausnahmebehandlung in Java (III) • Eine Methode muss Exceptions, die sie auslöst, nicht selber abfangen; dies kann auch in einer sie aufrufenden Methode erfolgen. – Exceptions werden auf diese Weise durch die Methoden-Aufrufkette quasi „nach oben“ propagiert. – Fängt eine Methode Exceptions nicht selbst ab, sondern leitet sie weiter, so muss die Exception bei der Definition der Methode angegeben werden. Anderenfalls resultiert ein Kompilierfehler. – Beispiel: Rückgabetyp Methodenname (Parameter) throws Exceptionklasse { ... } – wird eine Exception auf oberster Ebene weitergereicht, bricht das Programm mit einer sog. Runtime-Exception ab T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 14 Vorteile durch Einsatz von Java-Exceptions • Trennung des Fehlerbehandlungscodes vom normalen Programm. • Höhere Absturzsicherheit von Programmen dadurch, dass Methoden erzwingen können, dass Aufrufer eine Fehlerbehandlung vorsehen müssen • auf Grund der Exception-Klassenhierarchie können Fehler entweder gruppiert oder auch differenziert behandelt werden • Weiterreichen von Fehlern über verschachtelte Methodenaufrufe hinweg T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 15 Beispiel zur getrennten Fehlerbehandlung • ohne Exceptions void dateilesen() { öffnen(); if(öffnenok) { dateiInhaltlesen(); if (ok){ interpretieren; ... } else fehler; } else fehler; } • mit Exceptions try{ öffnen(); dateiInhaltlesen(); interpretieren(); } catch (Exception e) { fehlerbehandlung; } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 16 Übungsaufgabe • Schreiben Sie ein Programm, das ein Integer-Array mit 500 Elementen erzeugt. • Füllen Sie das Array mit Zufallszahlen, die im Bereich von 0 bis 99 liegen sollen. • Anschliessend soll eine Schleife 10000 mal 1. Eine Integer-Zufallszahl von 0 bis 510 erzeugen, 2. welche als Index in das Array verwendet wird und den an der entsprechenden Stelle befindlichen Wert x=a[zufallsindex] ausliest. 3. Dieser Wert x soll als Divisor für eine beliebige Division verwendet werden, z.B.: b = 10 / x • Welche Fehler treten bei der Programmausführung auf? • Ergänzen Sie das Programm um eine differenzierte Fehlerbehandlung, so dass es nicht mehr abbricht. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 17