Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Rosamond Kauer Geändert vor über 10 Jahren
1
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold Institut für Wirtschaftsinformatik Software Engineering JKU Linz
2
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 2 Themenbereiche Fehlerbehandlung (Exceptions) Streams, Files Übersicht
3
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 3 Welche Fehler können auftreten, während ein Java Programm läuft Falsche Benutzereingabe (User input errors) Gerätefehler (Device Errors) Überschreiten von Begrenzungen (Physical limitations) Programmierfehler (Code errors) Fehlerbehandlung
4
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 4 –1 oder null Die Aufgerufene Methode gibt einen Fehlercode zurück, den der Aufrufer analysiert In vielen Fällen zweckmäßig und sinnvoll Traditionelle Methoden Rückgabe eines Fehlercodes Beispiel public void foo() { int i; do { i = readIntegerFromFile("Nums.txt"); // do something } while (i != -1); }
5
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 5 Traditionelle Methoden 2 i == -1 könnte bedeuten: Datei ist zu Ende Wert ist vorhanden, konnte aber nicht gelesen werden Datei konnte nicht geöffnet, gefunden, gelesen werden anderer Fehler Es gibt noch kaum eine Möglichkeit zu entscheiden, ob nun einfach das File zu Ende war, oder tatsächlich – eine Ausnahmesituation eingetreten ist.
6
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 6 Fehlerbehandlung in Java Exception handling mechanism - Ausnahmebehandlung In Java wird im Falle einer Ausnahmesituation ein Exception-Objekt erzeugt und "geworfen" (thrown) public void foo() { int i; try { do { i = readIntegerFromFile("Nums.txt"); // do something } while (i != -1); } catch (IOException e) { //print e?, notify user... }
7
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 7 Fehlerbehandlung in Java 2 Verschiedene Exception Klassen Hierarchie aufgrund von Vererbung möglich Exceptions können weitergeworfen werden Neue Exception Klassen können durch Ableiten (Subclassing) erzeugt werden Die Java Klassenbibliothek verwendet Exceptions (zB bei Streams, Datenbankzugriff, Array-Zugriff, et.c.)
8
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 8 Hierarchie von Exceptions Die grundlegende Hierachie in Java ErrorException IOExceptionRuntimeException Throwable e.g bad cast out-of-bounds null pointer access illegal argument e.g. read past end of file
9
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 9 Hierarchie von Exceptions 2 Bedeutung und zweckmäßige Reaktion Error (z.b. MemFullError) wird bei internen Fehlern oder Memory full, et.c. geworfen kaum möglich, ev. Benutzer verständigen, selten Exception (z.b. IOException) Bei Fehlern in der Ein/Ausgabe von Daten Benutzer verständigen, Logfile, situationsbedingte Maßnahmen Andere von Exception abgeleitete Exceptions RuntimeException (z.b. Nullpointerexception) Meist bei Fehlern in der Programmierung (z.B. Array, null) sollten durch geeignete Programmierung vermieden werden
10
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 10 Programmieren mit Exceptions Übersicht Deklaration von Exceptions "Fangen" von Exceptions Erzeugen von eigenen Exception-Klassen
11
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 11 Programmieren mit Exceptions 2 Deklaration von Exceptions public void readIntegerFromFile(String s) throws IOException {... } Methoden, die Exceptions werfen, müssen diese (meist) deklarieren Dadurch weiß der Anwender der Methode, welche Ausnahmen er behandeln muß Der aufrufende Code muß (!) eine try/catch clause beinhalten oder selbst die Exception deklarieren In der Klassenbibliothek gibt es viele Methoden, die Exceptions werfen und deshalb eine try/catch clause fordern Nicht alle Exceptions erfordern try/catch clauses (null, Array)
12
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 12 Programmieren mit Exceptions 3 Implementierungsbeispiel Route public void printDistanceTo(String locationName) throws LocationUnknownException{ if (containsLocationByName(locationName)) { //ok } else { throw new LocationUnknownException() }... }
13
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 13 Programmieren mit Exceptions 4 Fangen von geworfenen Exception-Objekten public void bah() { String locName; locName = reader.getLocationName(); try { rout.printDistanceTo(locName); // do something with x } catch (LocationUnknownException e) { //notify user... }
14
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 14 Programmieren mit Exceptions 5 Erzeugen von eigenen Exception Klassen public class LocationUnknownException extends Exception { }
15
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 15 Programmieren mit Exceptions 6 Welche Exceptions muß man deklarieren und fangen? ErrorException IOExceptionRuntimeException Throwable e.g bad cast out-of-bounds null pointer access illegal argument e.g. read past end of file Errors und RuntimeExceptions sollten nie, können aber praktisch an jeder Stelle im Code auftreten. Deshalb müssen Sie weder deklariert noch gefangen werden.
16
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 16 Weiterführende Themen Deklaration von mehreren Exceptions throws ExceptionA, ExceptionB Fangen mehrerer Exceptions catch (ExceptionA a) {} catch (ExceptionB b) {} Weiterwerfen von Exceptions catch (ExceptionA a) { //do something throw a; }
17
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 17 Hinweise Im Praktikum werden wir vorwiegend Exceptions fangen (try/catch) Dies gilt insbesondere für die Anwendung der Klassenbibliothek (Streams) Wichtig ist zu verstehen, welcher Code tatsächlich zur Ausführung kommt public void foo() { int i; try { do { i = readIntegerFromFile("Nums.txt"); // do something } while (i != -1); } catch (IOException e) { //print e?, notify user... }
18
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 18 Streams Einleitung Input/Output Technik Streams sind ein einheitliches Konzept zur Eingabe von einer Quelle (Source) Ausgabe auf ein Ziel (Destination) Daten werden sequentiell gelesen und geschrieben Häufig wird von Files gelesen/auf Files geschrieben auch: Netzwerkverbindungen, Konsole oder Blöcke im Speicher (Array) Die Handhabung erfolgt letztlich auf die gleiche Art Alle Klassen im java.io package der Klassenbibliothek
19
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 19 Streams Einleitung 2 In Java ist jeder Eingabestrom (Bytes) von der abstrakten Klasse InputStream abgeleitet Jeder Ausgabestrom (Bytes) ist von der Klasse OutputStream abgeleitet. Da in Java Unicode für Characters verwendet wird, gibt es neben InputStreams und Outputstreams die abstrakten Klassen Reader und Writer Bytes -> InputStream, OutputStream Characters, Strings -> Reader, Writer
20
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 20 Streams Einleitung 3 Die Anwendung eines Readers unterscheidet sich kaum von der Anwendung eines Inputstreams (bzw. Writer/OutputStream) Die Java Klassenbibliothek unterstützt eine Vielzahl von Klassen die von den abstrakten Klassen InputStreams, Outputstreams, Readers und Writers ableiten und somit zur Anwendung für uns geeignet sind Wir werden nur einige wenige behandeln
21
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 21 Lesen und Schreiben von Bytes InputStream Die Klasse InputStream hat eine abstrakte Methode public abstract int read() throws IOException Diese Methode liest ein byte (keinen Character) Falls das Ende des Stroms erreicht wurde, wird –1 zurückgegeben Alle konkreten Klassen (abgeleitet) überschreiben diese Methode mit zweckmäßiger Funktionalität (z.B. FileInputStream) lesen mehrerer Bytes auf einmal: int read(byte[] b) int read(byte[] b, int off, int len) //returns actual number or -1
22
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 22 Lesen und Schreiben von Bytes OutputStream Die Klasse OutputStream hat eine abstrakte Methode public abstract void write(int b) throws IOException Diese Methode schreibt ein byte (keinen Character) Alle konkreten Klassen (abgeleitet) überschreiben diese Methode mit zweckmäßiger Funktionalität (z.B. FileOutputStream) Nachdem man das letzte byte geschrieben hat, muß close() aufgerufen werden, um Systemressourcen freizugeben (auch Input) Die Methode flush() kann aufgerufen werden, um die Daten aus einem eventuellen Buffer sofort auf das Ziel zu schreiben.
23
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 23 Lesen und Schreiben von Bytes Beispiel int b; try { FileInputStream fin = new FileInputStream("C:\\somedata.dat"); do { b = fin.read(); if (b!= -1) { // do something } } while (b != -1); fin.close(); } catch (IOException e) { //print e?, notify user... }
24
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 24 Input and Output Streams FileInputStream BufferedInput Stream ZipInputStream InputStream Für uns relevante InputStreams FilterInputStream InflatorInput Stream ObjectInputStream LineNumber InputStream
25
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 25 Input and Output Streams FileOutputStream BufferedOutput Stream ZipOutputStream OutputStream Für uns relevante OutputStreams FilterOutputStream InflatorOutput Stream ObjectOutputStream LineNumber OutputStream
26
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 26 Zusammenfassung InputStreams und OutputStreams InputStreams und OutputStreams sind zur Ein/Ausgabe von bytes geeignet Sie eignen sich schlecht zum Lesen und Schreiben von Text, da in Java Unicode verwendet wird (2 Bytes) Man kann Daten, wie ints, Doubles, et.c. zwar mit Streams schreiben; allerdings sind die erstellten Dateien nicht von Menschen lesbar 1234 im binärformat: 00 00 04 D2 (4 Bytes)
27
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 27 Readers and Writers Einleitung: Unicode Plattform: 1 Zeichen = 1 Byte Norm ASCII, allerdings nur 0..127 (z.B. keine Umlaute) Für die Werte 128-255 gibt es sog. "Codepages" (Länderspezifsch und/oder Plattformspezifisch) Ein "ö" unter Dos kann unter Windows und auf dem MAC anders interpretiert werden. Java verwendet Unicode: 1 Zeichen = 2 Bytes, weltweiter Standard stellt sicher, daß ein Unicode Zeichen überall gleich interpretiert wird
28
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 28 Readers and Writers Einleitung: Unicode (2) Problem: Files und ConsoleIO ist plattformspezifisch (Codepage) Bei der Eingabe müssen die plattformspezifischen Zeichen in Unicode übersetzt werden Umgekehrt müssen bei der Erstellung von Dateien die Unicode-Zeichen in plattformspezifische Zeichen übersetzt werden. Bei der direkten Verwendung von Streams müßte dies von Hand geschehen Readers und Writers übernehmen diese Aufgabe
29
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 29 Readers and Writers Einleitung: Unicode (3) Windows Verwendetes Encoding: 8859_1 Andere Bezeichnungen: ISO Latin-1 oder ANSI
30
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 30 Readers and Writers Anwendung Beim Erzeugen eines Readers oder Writers kann die Kodierung angegeben werden InputStreamReader inr = new InputStreamReader(new FileInputStream("D:\\localtext.txt")); //plattform Unterbleibt dies, wird automatisch die Kodierung der Plattform verwendet Auf Windows in USA "8859_1" ISO_Latin 1; bei uns "cp1252" InputStreamReader inr = new InputStreamReader(new FileInputStream("D:\\localtext.txt", "cp1255")); //Hebrew Von den erzeugten Readern kann dann unbesorgt gelesen werden, die nötige Übersetzung übernimmt die Implementierung des Readers
31
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 31 Writer try { OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:\\test.txt")); out.write("This is a Text ö ü ä ß ? + #"); //file will be readable with plattform dependent editors out.close(); } catch (IOException e) { // } Textausgabe Verkettung von Streams
32
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 32 Writer void write(char[] buf) void write(int c) void write(String str) void write(String str, int off, int len) abstract void close() abstract void flush() Die abstrakte Klasse Writer Keine Methoden zur Ausgabe von int, double, et.c. sehr ähnlich zu OutputStream
33
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 33 Writer Relevante Klassen BufferedWriter Writer OutputStreamWriterPrintWriter effizient newLine() - Methode minimal, kann auf OutputStream schreiben print(..) und println(...) Methoden für verschiedene Typen !!
34
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 34 PrintWriter Anwendung try { PrintWriter pw = new PrintWriter(new FileOutputStream("D:\\localtest.txt")); for (int i = 1; i < 100; i ++) { pw.print("Testzähler: "); pw.print(i); pw.print(';'); pw.println(1.0/i); } pw.close(); } catch (IOException e) { System.err.println("Error" + e); }
35
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 35 Ausblick Kommende Woche Readers Parsing von int, double,... File – Klasse (Zugriff auf Verzeichnisse) I/O mit der Konsole (TextIO-Klasse wird wegfallen) Verkettung von Streams
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.