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 10. Vorlesung WS-03/04 Formatieren des Quellcodes Regeln: 1. 2. 3. Klassennamen fangen mit GROßEN Buchstaben an. Attributs-, Variablen- und Methodenname fangen mit kleinen Buchstaben an. Nach jedem Semikolon ; (außer in for-Schleifen) und nach jeder geschweiften Klammer auf { und zu } folgt ein Zeilenumbruch ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Formatieren des Quellcodes - und warum ?? 1. 2. Bessere Lesbarkeit Einfacheres Finden von Fehlern ! class Punkt { public double x,y,z; public Punkt(double x, double y, double z){this.x=x;this.y=y;this.z=z;} public distanz_zu(Punkt anderer){double delta_x=this.x-anderer.x,double delta } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Formatieren des Quellcodes - und warum ?? 1. 2. Bessere Lesbarkeit Einfacheres Finden von Fehlern ! class Punkt { public double x,y,z; public Punkt(double x, double y, double z){ this.x = x; this.y = y; this.z = z; } public distanz_zu(Punkt anderer){ double delta_x = this.x-anderer.x, double delta_y = this.y-anderer.y; return(Math.sqrt(delta_x*delta_x+delta_y*delta_y)); } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Formatieren des Quellcodes - und warum ?? 1. 2. 3. Bessere Lesbarkeit Einfacheres Finden von Fehlern ! Die Fehlermeldungen des Compilers sind ZEILEN spezifisch class Punkt { public double x,y,z; public Punkt(double x, double y, double z){this.x=x;this.y=y;this.z=z;} public distanz_zu(Punkt anderer){double delta_x=this.x-anderer.x,double delta } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Formatieren des Quellcodes - und warum ?? 1. 2. 3. Bessere Lesbarkeit Einfacheres Finden von Fehlern ! Die Fehlermeldungen des Compilers sind ZEILEN spezifisch class Punkt { public double x,y,z; ... public distanz_zu(Punkt anderer){ double delta_x=this.x-anderer.x, double delta_y=this.y-anderer.y; return(Math.sqrt(delta_x*delta_x+delta_y*delta_y)); } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fehlertypen - z.B. NullPointerException, ClassCastException 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fehlertypen - z.B. NullPointerException, ClassCastException 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fang den Fehler und handle - try{ anweisung } catch ( fehler ) { warnung } Syntax : try{ anweisung(en); } catch( Fehlertyp e){ anweisung(en); } Anweisungen, bei denen ein Fehler auftreten kann. Anweisungen, die ausgeführt werden, sobald ein Fehler aufgetreten ist IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fang den Fehler und handle - try{ anweisung } catch ( fehler ) { warnung } public class Polygon { private Punkt[] eckpunkt; ... public void punkt_einfuegen( int position, Punkt punkt){ try{ eckpunkt[ position] = punkt; Fehlertyp = } irgend ein Fehler catch( Exception e){ System.out.println(“Polygon.punkt_einfuegen()“+ “::Ein Fehler wurde erkannt!“); } } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ 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( Exception e){ System.out.println(“Polygon.punkt_einfuegen()“+ Die “::Ein Fehler wurde erkannt!“); Reihenfolge } ist catch( NullPointerException npe){ da spezieller ! wichtig ! System.out.println(“Polygon.punkt_einfuegen()“+ “::Eckpunkte nicht angelegt!“); } } immer erst den spezielleren Fehler fangen ! } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fehlermeldungen weiterwerfen - throws Fehlertyp 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Fehlermeldungen weiterwerfen - throws fehler public class Polygon { private Punkt[] eckpunkt; ... public void leeres_Polygon( int anzahl_eckpunkte) throws Exception{ eckpunkt = new Punkt[ anzahl_eckpunkte]; } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Selbst Fehler werfen - throw( fehler); Syntax : throw new Fehlertyp(Parameter_des_Konstruktors); mit Aufruf einer throw-Anweisung wird die Methode an dieser Stelle abgebrochen ! Eine Methode, in der eine throw-Anweisung enthalten ist, muss diese Fehler weiterwerfen (throws) oder behandeln (try{}catch(){}) ! IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Selbst Fehler werfen - throw( fehler); public class Polygon { private Punkt[] eckpunkt; ... public void leeres_Polygon( int anzahl_eckpunkte) throws Exception{ if( anzahl_eckpunkte < 1){ throw( new Exception( “Polygon.leeres_Polygon(#)::“+ “zu wenig Eckpunkte“)); } eckpunkt = new Punkt[ anzahl_eckpunkte]; } ... } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien Messwerte Mein Programm Ergebnisse PNR X Y Z IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und (ein-)lesen Datei zum lesen öffnen Syntax : FileReader fr = new FileReader(“Dateiname“); FileReader ermöglicht das zeichenweise lesen von Dateiinhalten. unpraktisch für ASCII-Dateien mit Messwerten oder Texten IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und (ein-)lesen Besser : Syntax : BufferedReader br = new BufferedReader(new FileReader(“Dateiname“)); BufferedReader fasst die Zeichen aus dem FileReader zu Zeichenketten zusammen und puffert die Leseoperationen. Der BufferedReader verfügt u.a. über die Methoden: br.readLine() :: auslesen der nächsten Zeile (bis zum nächsten Zeilenumbruch) in einen String br.close() :: schließen der Datei alle Methoden und der Konstruktor werfen Fehler vom Typ IOException im Falle eines Fehlers. Weitere Methoden können der JavaDoc entnommen werden. IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Beispiel : import java.io.*; Java und ASCII-Dateien - öffnen und (ein-)lesen - class Polygon(){ private Punkt[] punkt; ... public void load(String filename){ BufferedReader br; String line; int i = 0; try{ br = new BufferedReader(new FileReader( filename)); while( (line = br.readLine()) != null){ punkt[i++] = new Punkt( line); } br.close(); } catch( FileNotFoundException fnfe){ System.out.println(“The file :‘“+ filename +“‘ does not exist“); } catch( IOException ioe){ ioe.printStackTrace(); }}} IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und (ein-)lesen Beispiel : import java.io.*; class Polygon(){ private Punkt[] punkt; ... public void load(String filename) throws IOException{ BufferedReader br = new BufferedReader( new FileReader( filename)); String line; int i = 0; while( (line = br.readLine()) != null){ punkt[i++] = new Punkt( line); } br.close(); } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings in Double-Werte wandeln Beispiel : import java.io.*; class Distanz_Tabelle(){ private double[] distanz; ... public void load(String filename) throws IOException{ BufferedReader br = new BufferedReader( new FileReader( filename)); String line; int i = 0; while( (line = br.readLine()) != null){ distanz[i++] = Double.parseDouble( line); } br.close(); } } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : DEBUGGING ... String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } line parts[0] parts[1] parts[2] last first i = “10.0;20.0;30.0;“ = null = null = null =4 =0 =0 IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : DEBUGGING ... String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } line parts[0] parts[1] parts[2] last first i = “10.0;20.0;30.0;“ = “10.0“ = null = null =4 =0 =0 IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : DEBUGGING ... String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } line parts[0] parts[1] parts[2] last first i = “10.0;20.0;30.0;“ = “10.0“ = null = null =4 =0 =1 IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : DEBUGGING ... String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } line parts[0] parts[1] parts[2] last first i = “10.0;20.0;30.0;“ = “10.0“ = null = null =4 =5 =1 IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Exkurs - Strings zerlegen Beispiel : DEBUGGING ... String line = “10.0;20.0;30.0;“; String[] parts = new String[3]; int first = 0, last, i = 0; while((last = line.indexOf(“;“, first)) != -1){ parts[i] = line.substring( first, last); i++; first = last + 1; } und so weiter ... line parts[0] parts[1] parts[2] last first i = “10.0;20.0;30.0;“ = “10.0“ = null = null =9 =5 =1 IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und schreiben Datei zum Schreiben öffnen Syntax : FileWriter fr = new FileWriter(“Dateiname“); FileWriter ermöglicht das Schreiben von Dateiinhalten. IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und schreiben Datei zum schreiben öffnen Syntax : 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Java und ASCII-Dateien - öffnen und schreiben Datei zum schreiben öffnen Syntax : PrintWriter pw = new PrintWriter( 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. • PrintWriter ermöglicht die Ausgabe aller primitiven Datentypen als Strings. IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Beispiel : class Polygon{ private Punkt[] punkt; - öffnen und schreiben ... public void write(String filename) throws IOException{ PrintWriter pw = new PrintWriter( new BufferedWriter( new FileWriter( filename))); for( int i = 0; i < punkt.length; i++){ pw.write( punkt[i].gibID()); pw.write( “;“); pw.write( punkt[i]. gibX()); pw.write( “;“); pw.write( punkt[i]. gibY()); pw.writeln( “;“); } pw.close(); } } Java und ASCII-Dateien IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 ENDE NOCH FRAGEN ??? IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Übungsaufgabe Schreibt eine Klasse Punkt mit den Attributen pnr, x und y, die die Methoden distanz_zu( Punkt other) und ausgabe() haben soll. Fange in der Methode distanz_zu(Punkt other) NullPointerExceptions ab. Schreibt eine Klasse Polygon, die unter Verwendung eines Arrays Punkte [punkt_hinzu(Punkt punkt)] aufnehmen und mittels der Methode umfang() ihren aktuellen Umfang berechen kann und zudem eine Methode ausgabe() besitzt. Eventuell mögliche Exceptions sind zu fangen ! Teste die Funktionen in einer Klasse Test_Main. IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Hausaufgabe(1/2) Ergänze die Klasse Punkt aus der Übung um den Konstruktor Punkt( String line), wobei gilt: line=“pnr;x-wert;y-wert;“. (siehe auch eine Zeile der polygon.txt !!) Ergänze die Klasse Polygon aus der Übung um eine Methode lade(String dateiname) zum Einlesen eines Polygons aus einer Datei und um eine Methode datei_ausgabe(String dateiname) zum Ausgeben der Punktnummern der Punkte im Polygon, sowie des Polygonumfangs in eine Datei. Teste die Funktionen in einer Klasse Test_Main. IKG WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04 Hausaufgabe(1/2) 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 WS03/04 IKG;Dörschlag, Dörschlag,Plümer, Plümer,Gröger Gröger;„Einführung Einführungin indie dieProgrammierung Programmierungmit mitJava“ Java WS03/04