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
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Übersicht Fehlerbehandlung Schreiben in Dateien Lesen aus (Text-)Dateien –zeilenweise –Lesen von Token ("Parsen")
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Laufzeitfehler: Beispiel int[ ] a; a = new int[2]; a[0] = 5; a[1] = 6; a[2] = 6; //Fehler
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Abfangen des Fehlers: try-catch try{ int[ ] a; a = new int[2]; a[0] = 5; a[1] = 6; a[2] = 6; } catch(java.lang.Exception e){ System.out.println("Fehler: Arraygrenze überschritten"); } Anweisungen, bei denen ein Fehler auftreten kann. Anweisungen, die ausgeführt werden, sobald ein Fehler aufgetreten ist hier geht es in jedem Fall weiter
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Exceptions: Klassen-Hierarchie Throwable (from lang) Exception (from lang) ArrayIndexOutOfBoundsException (from lang) ArithmeticException (from lang) IOException (from io) FileNotFoundException (from io)
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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. Student student; student.drucke_ausweis(); Beispiel :
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Exception-Klassen II/II ArrayIndexOutOfBoundsException ( extends Exception) Tritt auf, wenn auf ein Arrayelement zugegriffen wird, das nicht existiert. Student student = new Student[2] Student student[3] = new Student(“Dirk“,“Dörschlag“); Beispiel : ClassCastException ( extends Exception) Tritt auf, wenn ein Objekt mittels expliziter Typenkonvertierung in eine Typ umgewandelt wird, welcher nicht zu seinen Ahnen gehört Student student = new Student(“Dirk“,“Dörschlag“); Dozent dozent = (Dozent) student; Beispiel :
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Fang den Fehler und handle - Differenzierung nach Fehlertyp - try{ anweisung(en); } catch( Fehlertyp_1 f1){ anweisung(en); } catch( Fehlertyp_2 f2){ anweisung(en); } Syntax : Anweisungen, bei denen ein Fehler auftreten kann. Anweisungen, die ausgeführt werden, sobald ein Fehlertyp_2 aufgetreten ist Anweisungen, die ausgeführt werden, sobald ein Fehlertyp_1 aufgetreten ist
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 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!“); } Fang den Fehler und handle - try{ anweisung } catch ( fehler ) { warnung } -
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Fehlermeldungen weiterleiten - Syntax - modifier class Klassenname {... modifier rueckgabetyp methodenname( parameter) throws Fehlertyp_1(, Fehlertyp_2,...) { anweisung(en); }... } Syntax : die Methode wird an der Stelle abgebrochen, an der der Fehler auftritt !
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Schreiben in/Lesen aus Text-Dateien Mein Programm Messwerte Ergebnisse PNRXYZ
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 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 Zeichenweises Lesen aus Dateien
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Java und ASCII-Dateien - öffnen und (ein-)lesen - Beispiel : import java.io.*; 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Lesen von Token aus Textdatei Token Delimiter Token Delimiter
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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: abcde,f66,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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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: Dateiende TT_EOL: Zeilenende TT_NUMBER : Zahl TT_WORD : String –double nval: Token als double –String sval:Token als String
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 ENDE FRAGEN ?
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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":
IKG Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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 Gröger, Dörschlag, Plümer, „Einführung in die Programmierung mit Java“ WS04/05 Dörschlag IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Fortgeschrittene Übungsaufgabe (2/2) Datei polygon.txt