Title: Einf
1Einführung in dieProgrammierung mit Java
2Übersicht
- Fehlerbehandlung
- Schreiben in Dateien
- Lesen aus (Text-)Dateien
- zeilenweise
- Lesen von Token ("Parsen")
3Laufzeitfehler 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.
4Fehler während des Ablaufs- Beispiel -
public class Polygon private Punkt
eckpunkt public Polygon() super() pub
lic void leeres_Polygon( int anzahl_eckpunkte)
eckpunkt new Punkt anzahl_eckpunkte publ
ic void punkt_einfuegen( int position, Punkt
punkt) eckpunkt position punkt
mögliche Fehler
negative Anzahl
Position außerhalb des Arrays
Array noch nicht angelegt
5Laufzeitfehler Beispiel
- ................................
- int a
- a new int2
- a0 5
- a1 6
- a2 6 //Fehler
6Abfangen des Fehlers try-catch
- ................................
- try
- int a
- a new int2
- a0 5
- a1 6
- a2 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
7Ausnahmebehandlung 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)
8Exceptions Klassen-Hierarchie
Throwable
(from lang)
Exception
(from lang)
ArrayIndexOutOfBoundsException
ArithmeticException
IOException
(from lang)
(from lang)
(from io)
FileNotFoundException
(from io)
9Exception-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()
10Exception-Klassen II/II
ArrayIndexOutOfBoundsException ( extends
Exception) Tritt auf, wenn auf ein Arrayelement
zugegriffen wird, das nicht existiert.
Beispiel
Student student new Student2 Student
student3 new Student(Dirk,Dörschlag)
11Differenzierte 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)
12Fang 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
13Fang 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_einfueg
en()
Eckpunkte nicht angelegt!) catch(
Exception e) System.out.println(Polygon.punkt
_einfuegen()
Ein Fehler wurde
erkannt!)
14Mehrere 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
15Weiterleiten 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
-
16Fehlermeldungen 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 !
17Fehlermeldungen weiterleiten- Beispiel -
public class Polygon private Punkt
eckpunkt ... public void leeres_Polygon(
int anzahl_eckpunkte) throws Exception eckpunk
t new Punkt anzahl_eckpunkte ...
18Ü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!")
19Schreiben in/Lesen aus Text-Dateien
Messwerte
Mein Programm
Ergebnisse
PNR
X
Y
Z
20Schreiben 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)
21Schreiben 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
22Schreiben 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)
23Gepuffertes 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 !
24Lesen 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
25Zeichenweises 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
26Zeilenweises 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
27Java 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\\Koordinat
en.txt")) while( (line br.readLine()) !
null) //für jede Zeile wird Konstruktor von
von Punkt aufgerufen punkti new Punkt(
line) i i1 br.close()
catch( FileNotFoundException fnfe) System.o
ut.println(The file filename does not
exist) catch( IOException
ioe) ioe.printStackTrace()
28Lesen von Token aus Textdatei
Token
Delimiter
Delimiter
Token
29Lesen 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
30Extraktion 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
31Beispiel Lesen von Token aus Textdatei
- import java.io.
- ................
- try
- FileReader fr new FileReader("M\\Java\\Beispie
l.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)
32Extraktion 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
33StringTokenizer Beispiel
- try
- StringTokenizer st new StringTokenizer("ABCDEF
GH","") - while(st.hasMoreTokens())
- System.out.println(st.nextToken())
-
-
- catch(Exception e) e.printStackTrace()
- //Ausgabe
- //ABC
- //DEF
- //GH
34Exkurs Konvertieren von Strings
- Konvertieren von Strings in double
Double.parseDouble. Beispiel String s
"4.6566" double d Double.parseDouble(s) //nu
n steht in d die Zahl 4.6566
35ENDE
FRAGEN ?
36Hausaufgabe
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
37Fortgeschrittene Ü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.
38Fortgeschrittene Ü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