Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit Java 12. Vorlesung WS 04/05 Übersicht • Fehlerbehandlung • Schreiben in Dateien • Lesen aus (Text-)Dateien – zeilenweise – Lesen von Token ("Parsen") IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Laufzeitfehler in Java • Viele Fehler werden vom Compiler aufgedeckt (z.B. fehlendes Semikolon, nicht deklarierte Variable) • Andere Art von Fehler: Laufzeitfehler – tritt während der Ausführung des Programms auf – unterbricht den normalen Fluss der Befehle (Programm stützt ab) – Name dieser Fehler: Ausnahme (engl. Exception) • 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. IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fehler während des Ablaufs - Beispiel public class Polygon { private Punkt[] eckpunkt; public Polygon(){ super(); } public void leeres_Polygon( int anzahl_eckpunkte){ eckpunkt = new Punkt[ anzahl_eckpunkte]; } public void punkt_einfuegen( int position, Punkt punkt){ eckpunkt[ position] = punkt; } } mögliche Fehler negative Anzahl Position außerhalb des Arrays Array noch nicht angelegt IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Laufzeitfehler: Beispiel ................................ int[ ] a; a = new int[2]; a[0] = 5; a[1] = 6; a[2] = 6; //Fehler IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Abfangen des Fehlers: try-catch ................................ Anweisungen, bei try{ denen ein Fehler int[ ] a; auftreten kann. a = new int[2]; Anweisungen, die a[0] = 5; ausgeführt werden, a[1] = 6; sobald ein Fehler a[2] = 6; aufgetreten ist } catch(java.lang.Exception e){ System.out.println("Fehler: Arraygrenze überschritten"); } hier geht es in jedem Fall weiter IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Ausnahmebehandlung in Java • Vorteile der Java-Ausnahmebehandlung – Programm stürzt nicht ab – Programm macht an genau definierter Stelle weiter – systematische und übersichtliche Trennung von normalem und fehlerbehandelndem Code • Im Falle einer Ausnahme wird ein sog. Exception-Objekt erzeugt und weitergeleitet – Instanz der Klasse Exception oder von Unterklasse – Exception-Objekt erhält Information über Ausnahme – Exception-Objekt wird mit catch gefangen (Fehlerbehandlung) IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Exceptions: Klassen-Hierarchie Throwable (from lang) Exception (from lang) ArrayIndexOutOfBoundsException (from lang) IOException (from io) ArithmeticException (from lang) FileNotFoundException (from io) IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Exception-Klassen I/II Exception Der universelle Vater aller Fehlermeldungen. Von dieser Klasse sind alle anderen abgeleitet. NullPointerException ( extends Exception) Tritt auf, wenn ein Objekt benutzt werden soll, obwohl es noch nicht angelegt wurde. Beispiel : Student student; student.drucke_ausweis(); IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Exception-Klassen II/II ClassCastException ( extends Exception) Tritt auf, wenn ein Objekt mittels expliziter Typenkonvertierung in eine Typ umgewandelt wird, welcher nicht zu seinen Ahnen gehört Beispiel : Student student = new Student(“Dirk“,“Dörschlag“); Dozent dozent = (Dozent) student; ArrayIndexOutOfBoundsException ( extends Exception) Tritt auf, wenn auf ein Arrayelement zugegriffen wird, das nicht existiert. Beispiel : Student student = new Student[2] Student student[3] = new Student(“Dirk“,“Dörschlag“); IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Differenzierte Fehlerbehandlung • in try-Block können verschiedene Arten von Fehlern auftreten – differenzierte Behandlung sinnvoll • Lösung: – mehrere catch-Anweisungen, eine für jeden Fehlertyp – Unterscheidung anhand des Namens des Fehlers (der Exception) IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fang den Fehler und handle - Differenzierung nach Fehlertyp Syntax : try{ anweisung(en); } catch( Fehlertyp_1 f1){ anweisung(en); } catch( Fehlertyp_2 f2){ anweisung(en); } Anweisungen, bei denen ein Fehler auftreten kann. Anweisungen, die ausgeführt werden, sobald ein Fehlertyp_1 aufgetreten ist Anweisungen, die ausgeführt werden, sobald ein Fehlertyp_2 aufgetreten ist IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fang den Fehler und handle - try{ anweisung } catch ( fehler ) { warnung } public class Polygon { public void punkt_einfuegen( int position, Punkt punkt){ try{ eckpunkt[ position] = punkt; } catch( NullPointerException npe){ System.out.println(“Polygon.punkt_einfuegen()“+ “::Eckpunkte nicht angelegt!“); } catch( Exception e){ System.out.println(“Polygon.punkt_einfuegen()“+ “::Ein Fehler wurde erkannt!“); } } } IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Mehrere Catch-Klauseln • die in der Reihenfolge erste catch-Klausel, die passt, wird verwendet – dann ist try-catch beendet • Beispiel: try{ eckpunkt[ position] = punkt; } catch( Exception e){.....} catch( NullPointerException npe){....}; //Zweite catch-Klausel wird nie erreicht • Daher: Zuerst die speziellere, dann die allgemeinere Exception IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Weiterleiten von Exceptions • Bisher: Fehler in try{...} wurde in catch(..){...} abgefangen und behandelt • Alternative: Weiterleiten des Fehlers in einer Methode m nach oben an die Methode, die m aufruft – dort muss Fehler mit try-catch behandelt werden oder wiederum an die aufrufende Methode weitergeleitet werden – die Methode m muss dies durch throws-Klausel kenntlich machen. Beispiel: public void leeres_Polygon( int anzahl_eckpunkte) throws Exception{ eckpunkt = new Punkt[ anzahl_eckpunkte]; } IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fehlermeldungen weiterleiten - Syntax Syntax : modifier class Klassenname { ... modifier rueckgabetyp methodenname( parameter) throws Fehlertyp_1(, Fehlertyp_2, ...) { anweisung(en); } ... } die Methode wird an der Stelle abgebrochen, an der der Fehler auftritt ! IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fehlermeldungen weiterleiten - Beispiel public class Polygon { private Punkt[] eckpunkt; ... public void leeres_Polygon( int anzahl_eckpunkte) throws Exception{ eckpunkt = new Punkt[ anzahl_eckpunkte]; } ... } IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Übung im GIS-Labor • Macht das folgende Programm mittels try {...} catch (Exception e) {...} absturzsicher und gebt bei einem Fehler eine Fehlermeldung aus (Tip: nutzt die Methode printStackTrace() von Exception) class Ereignis1 { public static void main (String args[]) { int a; int b = 0; a = 10/b; System.out.println("Programmende wurde erreicht!"); } } IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Schreiben in/Lesen aus Text-Dateien Messwerte Mein Programm Ergebnisse PNR X Y Z IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Schreiben in Datei: Beispiel I import java.io.*; ........ try{ FileWriter fr = new FileWriter("d:\\tmp\\log.txt"); fr.write("Dieser Text steht in der ersten Zeile der "); fr.write("Datei log.txt.\n"); fr.write("Und dieser in der zweiten."); fr.close(); } catch(Exception e){} IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Schreiben in Datei • Öffnen der Datei: Erzeugen einer Instanz der Klasse "FileWriter" – Dateiname als Parameter des Konstruktors • Scheiben: Aufruf der Methode write(...) für Instanz von FileWriter (Analog zu System.out.println) • wenn fertig mit schreiben: Aufruf der Methode close() für Instanz von FileWriter • alles muss in try{ ..} stehen (da fehleranfällig) • Package "java.io" muss importiert werden IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Schreiben in Datei: Beispiel II import java.io.*; ........ try{ //der folgende Konstruktor ermöglicht das Anfügen von // Text am Ende der Datei (falls diese vorhanden ist) FileWriter fr = new FileWriter("d:\\tmp\\log.txt",true); fr.write("...."); fr.close(); } catch(Exception e){} IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Gepuffertes Schreiben • Datei zum schreiben öffnen: BufferedWriter bw = new BufferedWriter (new FileWriter(“Dateiname“)); • FileWriter ermöglicht das Schreiben von Dateiinhalten. • BufferedWriter puffert das Schreiben. Es wird nur noch in die Datei geschrieben, wenn die Methode flush() oder close() aufgerufen wird. bessere Performance ! IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Lesen von Dateien • allgemein: Lesen von Streams – Stream: Abstraktion der Information, die von Gerät geliefert bzw. an Gerät geschickt wird – hier: nur Lesen aus (Text-)Dateien • Unterschiede hinsichtlich der Menge der Zeichen, die in einem Schritt gelesen werden: – – – – ein Buchstabe: FileReader eine Zeichenkette einer bestimmten Länge eine Zeile: BufferedReader eine Token (Zeichenkette, die von bestimmten Zeichen abgegrenzt werden): StreamTokenizer IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Zeichenweises Lesen aus Dateien • Datei zum lesen öffnen: FileReader fr = new FileReader(“Dateiname“); • FileReader ermöglicht das zeichenweise Lesen von Dateiinhalten • unpraktisch für ASCII-Dateien mit Messwerten oder Texten • besser: Erzeugen eines BufferedReader aus FileReader IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Zeilenweises Lesen aus Dateien • Datei öffnen: BufferedReader br = new BufferedReader(new FileReader(“Dateiname“)); • BufferedReader fasst die Zeichen aus dem FileReader zu Zeichenketten zusammen • Der BufferedReader verfügt u.a. über die Methoden – readLine(): auslesen der nächsten Zeile (bis zum nächsten Zeilenumbruch) in einen String – close(): schließen der Datei • Weitere Methoden: JavaDoc IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Beispiel : import java.io.*; Java und ASCII-Dateien - öffnen und (ein-)lesen - ................................. BufferedReader br; String line; int i = 0; try{ br = new BufferedReader(new FileReader("c:\\Koordinaten.txt")); while( (line = br.readLine()) != null){ //für jede Zeile wird Konstruktor von von Punkt aufgerufen punkt[i] = new Punkt( line); i = i+1; } br.close(); } catch( FileNotFoundException fnfe){ System.out.println(“The file :‘“+ filename +“‘ does not exist“); } catch( IOException ioe){ ioe.printStackTrace(); } IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Lesen von Token aus Textdatei Token Token Delimiter Delimiter IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Lesen von Token aus Textdatei • Token: Teil eines Strings (Stream), der von Delimitern begrenzt wird • Beispiel: – String: "abc de,f 66,z-2" – Delimiter: {" "} //Leerzeichen • 3 Token: abc de,f 66,z-2 – Delimiter: {" ",","} //Leerzeichen und Komma • 5 Token: abc de f 66 z-2 • Ziel: Extraktion der Token aus String, die bestimmte Bedeutung haben (Parsen) – Abhängig von Menge der Delimiter IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Extraktion von Token: Klasse StreamTokenizer • Standard-Delimiter: Leerzeichen, Zeilenende, Dateiende, ... (können ergänzt werden) • Methoden von StreamTokenizer: – StreamTokenizer(Reader): Konstruktor – int nextToken(): schaltet auf nächstes Token um • Attribute eines Token: – int ttype: Typ des Token • • • • TT_EOF: TT_EOL: TT_NUMBER : TT_WORD : – double nval: – String sval: Dateiende Zeilenende Zahl String Token als double Token als String IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Beispiel: Lesen von Token aus Textdatei import java.io.*; ................ try{ FileReader fr = new FileReader("M:\\Java\\Beispiel.txt"); StreamTokenizer st = new StreamTokenizer(fr); double d; String s; while(st.nextToken() != StreamTokenizer.TT_EOF){ switch (st.ttype){ case StreamTokenizer.TT_NUMBER: d = st.nval; break; case StreamTokenizer.TT_WORD: s = st.sval; break; default: break;} //hier kann mit d und s etwas gemacht werden } fr.close(); }catch(Exception e) { ;} IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Extraktion von Token: Klasse StringTokenizer • ähnlich zu StreamTokenizer • arbeitet auf Strings (z.B. Zeile aus Textdatei) • Konstruktor (zu parsender String und Delimiter): StringTokenizer st = new StringTokenizer(str,";"); • Methoden: – boolean hasMoreTokens() – String nextToken() • importieren des Package java.util IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 StringTokenizer: Beispiel try{ StringTokenizer st = new StringTokenizer("ABC;DEF;GH",";"); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); } } catch(Exception e) {e.printStackTrace();} //Ausgabe: //ABC //DEF //GH IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Exkurs: Konvertieren von Strings • Konvertieren von Strings in double: Double.parseDouble. Beispiel: String s = "4.6566"; double d = Double.parseDouble(s); //nun steht in d die Zahl 4.6566 IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 ENDE FRAGEN ? IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Hausaufgabe Lest aus der Datei "zahlen.txt" die 6 Zahlen ein und gebt die Summe dieser 6 Zahlen in eine Datei "ergebnis.txt" aus. Datei "zahlen.txt": 7.99 4.98 2.77 2.0 22.99 43.98 IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fortgeschrittene Übungsaufgabe (1/2) Ergänze die Klasse Polygon (Vorlesung 11) um eine Methode, die die Datei "polygon.txt" (nächste Folie) einliest und daraus ein Polygon mit 5 Punkten erzeugt. In einer Zeile dieser Datei steht die Punktnummer, die x-Koordinate und die y-Koordinate eines Punktes. Teste die Funktionen in einer Klasse Test_Main. IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04 Fortgeschrittene Übungsaufgabe (2/2) Datei polygon.txt 1 2 3 4 5 2.0 4.0 8.0 7.0 1.0 3.0 3.0 9.0 10.0 6.0 IKG Dörschlag, WS04/05 IKG;Gröger, Dörschlag, Plümer,Plümer, Gröger;„Einführung Einführung in in die die Programmierung Programmierung mit mit Java“ Java WS03/04