Vorlesung 12 - Institut für Geodäsie und Geoinformation der

Werbung
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
Herunterladen