380 likes | 565 Views
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"). Laufzeitfehler in Java.
E N D
Einführung in dieProgrammierung mit Java 12. Vorlesung WS 04/05
Übersicht • Fehlerbehandlung • Schreiben in Dateien • Lesen aus (Text-)Dateien • zeilenweise • Lesen von Token ("Parsen") 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; 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; 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Abfangen des Fehlers: try-catch Anweisungen, bei denen ein Fehler auftreten kann. ................................ 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, die ausgeführt werden, sobald ein Fehler aufgetreten ist hier geht es in jedem Fall weiter 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; 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 IOException ArithmeticException (from lang) (from io) (from lang) FileNotFoundException (from io) 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. Beispiel : Student student; student.drucke_ausweis(); IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
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; Exception-Klassen II/II 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, 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Fang den Fehler und handle- Differenzierung nach Fehlertyp - Anweisungen, bei denen ein Fehler auftreten kann. Syntax : try{ anweisung(en); } catch( Fehlertyp_1 f1){ anweisung(en); } catch( Fehlertyp_2 f2){ anweisung(en); } 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, Plümer, Gröger; Einführung in die Programmierung mit 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, 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; 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Fehlermeldungen weiterleiten- Syntax - Syntax : modifierclass 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, 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; 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Schreiben in/Lesen aus Text-Dateien Messwerte Mein Programm Ergebnisse PNR X Y Z 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; 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; 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; 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; 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit 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, 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; 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Lesen von Token aus Textdatei Token Delimiter Delimiter Token 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: 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, 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; 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{ FileReaderfr = new FileReader("M:\\Java\\Beispiel.txt"); StreamTokenizerst = 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, 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; 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; 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 4.6566 IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
ENDE FRAGEN ? 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": 7.99 4.98 2.77 2.0 22.99 43.98 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; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04
Fortgeschrittene Übungsaufgabe (2/2) Datei polygon.txt 1 2.0 3.0 2 4.0 3.0 3 8.0 9.0 4 7.0 10.0 5 1.0 6.0 IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04