Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Ausnahmen

Ähnliche Dokumente
Programmiertechnik Ausnahmen

Einführung in die Programmierung mit Java

Ausnahmebehandlung. Ausnahmen werfen (auslösen) Eigene Ausnahmen definieren. Ausnahmen abfangen. Ausnahmen definieren

7. Java Fehler und Ausnahmen

Vorlesung 10. Sitzung Grundlegende Programmiertechniken

Ausnahmen (Exceptions)

Robuste Programme durch Ausnahmebehandlung

Java Einführung Exception Handling. Kapitel 17

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

7. Java Input/Output. Benutzereingaben/Konsolenausgabe, Datei Ein- und Ausgabe (I/O)

Ausnahmen. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Grundlagen der Programmierung Prof. H. Mössenböck. 16. Ausnahmen (Exception Handling)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 11. Fehler und Ausnahmen

Ausnahmen. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 13/14. Kapitel 11. Fehler und Ausnahmen

9. Ausnahmebehandlung

Ausnahmen. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Ausnahmen. Dr. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden

9. Ausnahmebehandlung

Zuverlässigkeit von Programmen: Behandlung von Ausnahmesituationen

Kapitel 12: Ausnahmen und Ausnahmebehandlung

II.4.4 Exceptions - 1 -

12. Java Fehler und Ausnahmen

Java Fehlerbehandlung

Ausnahmen. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Kapitel 11: Ausnahmebehandlung

Mögliche Implementierung von intern():

Grundlagen der Fehlerbehandlung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 06: Ausnahme- und Fehlerbehandlung in Java.

Liste Programmieren Java Überblick

Selectionsort Beispiel

Objektorientierte Programmierung. Kapitel 9: Exceptions I

6. Java Fehler und Ausnahmen

Exceptions - Klausuraufgaben

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Programmiertechnik Klassenmethoden

Abschnitt 7: Weitere Konzepte der oo Programmierung in Java

9. Ausnahmebehandlung

Handbuch konsultieren!

EINFÜHRUNG IN DIE PROGRAMMIERUNG

1.7 Fehler- und Ausnahmebehandlung

Objektorientierte Programmierung. Kapitel 13: Exceptions

15 Fehlerobjekte: Werfen, Fangen, Behandeln

Exception. 6. Exceptions. Die Klasse java.lang.exception. Fehlermeldung. Klassenname. Ort des Auftretens

6. Java Fehler und Ausnahmen. Fehler, Systemausnahmen, Benutzerausnahmen, Behandeln von Ausnahmen, Spezialfall Ressourcen

Ausnahmen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 27.6.

Sortieralgorithmen. Nachfolgend wird die Menge der ganzen Zahlen und die darauf definierte Relation betrachtet.

15 Fehlerobjekte: Werfen, Fangen, Behandeln

15 Fehlerobjekte: Werfen, Fangen, Behandeln. Idee. Fehlerklassen. Fehlerklassen

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 16/ / 854

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

II.4.4 Exceptions - 1 -

Java : Fehlerbehandlung.

Vorlesung Informatik II

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Ausnahmen. Exceptions. Definition Ausnahmen erzeugen Ausnahmen abfangen Ausnahmen weiterleiten. Dr. Beatrice Amrhein

9. Fehler und Ausnahmen Grundlagen der Programmierung 1 (Java)

Objektorientierte Programmierung. Kapitel 9: Exceptions I

15 Fehlerobjekte: Werfen, Fangen, Behandeln

15 Fehlerobjekte: Werfen, Fangen, Behandeln. Idee. Fehlerklassen. Fehlerklassen

15 Fehlerobjekte: Werfen, Fangen, Behandeln

Javakurs für Anfänger

Java - Programmierung - Prozedurale Programmierung 1

4.5 Exceptions. TU Darmstadt Allgemeine Informatik II, SS 05

Übungsstunde 9. Einführung in die Programmierung I

Einführung in die Programmierung für NF. Fehler und Ausnahmen

Komponenten-basierte Entwicklung Teil 4: Exceptions

Ausnahmebehandlung PK11W-16,

Ausdrucksbäume in verschiedenen Darstellungen

System.out.println("TEXT");

boolean ispalindrome = word.equalsignorecase(reverse.tostring());

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Übungen zu Middleware Universität Erlangen-Nürnberg Informatik 4, 2007 Z-Java-Exceptions.fm

Umgang mit Fehlern. Sinn von Ausnahme-/Fehlerobjekten Dokumentation Umgang mit Fehlern Eigene Fehlerklassen

Programmiertechnik Klassen

Java I Vorlesung Exceptions

Einführung in die Informatik

1 Klassen anlegen und Objekte erzeugen

Einstieg in die Informatik mit Java

Einführung in die Programmierung Blockkurs Java

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Exceptions. CoMa-Übung VI TU Berlin. CoMa-Übung VI (TU Berlin) Exceptions / 19

Einführung in die Programmierung

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Informatik 1 - Translation Studies in Information Technology. Musterlösung zum Aufgabenblatt der ersten Pflichtübung im Wintersemester 16/17

Programmieren in Java

Transkript:

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Ausnahmen

Motivation Anwendungsbeispiel 1: java Excep1 a: 15 b: 3 a / b = 5 Job done. Konsole Anwendungsbeispiel 2: Konsole java Excep1 a: 15 b: 0 java.lang.arithmeticexception: / by zero at Excep1.doYourJob(Excep1.java:7) 2/27

Motivation Unter bestimmten Umständen kann das Programm nicht ordnungsgemäß beendet werden, sondern liefert einen Fehler und bricht ab. Es gibt eine Vielzahl möglicher Fehlerquellen: arithmetische Operationen (Division durch 0, ) Zugriff auf Datei, die nicht existiert Schreibzugriff auf schreibgeschützte Datei Festplattenschaden Programm lädt Daten aus dem Internet herunter, Kommunikationsverbindung bricht ab. Diese Vorlesung handelt davon, wie man in Java-Programmen mit solchen Fehlersituationen umgeht. 3/27

Ansätze zur Fehlerbehandlung In älteren Programmiersprachen (z.b. in C) verwendet man die Funktionsrückgabewerte, um fehlerhafte Funktionsausführung anzuzeigen integrierte Fehlerbehandlung Das Fehlschlagen einer Funktion wird dabei üblicherweise durch einen negativen Rückgabewert angezeigt. 4/27

Integrierte Fehlerbehandlung C-Stil Fehlerbehandlung in Java: public class Excep2 { public int int doyourjob() { Scanner scanner = new new Scanner(System.in); System.out.print("a: "); "); int int a = scanner.nextint(); System.out.print("b: "); "); int int b = scanner.nextint(); if if ( b == == 0 ) return -1; -1; System.out.println("a / b = " + a/b); return 0; 0; 5/27

Integrierte Fehlerbehandlung public static void main(string[] args) { int ret; Excep2 instance = new Excep2(); if if ( ( ret = instance.doyourjob() ) < 0 ) System.out.println("Fehlercode: " + ret); else System.out.println("Job done."); Konsole java Excep2 a: 15 b: 0 Fehlercode: -1 6/27

Integrierte Fehlerbehandlung Integrierte Fehlerbehandlung hat mehrere Nachteile: verschiedene Fehlerwerte für verschiedene Funktionen, manchmal bedeutet 0 Fehler, manchmal -1, manchmal jeder negative Wert Aufrufer muss wissen, welchen Wert Funktion im Fehlerfall liefert Fehlerbehandlung integriert in "regulären" Code schwer lesbar Fehler sollten die Ausnahme sein unnatürlich, den Rückgabewert einer Funktion dem Fehlerfall zu widmen Wenn eine Funktion tatsächlich einen Wert liefern soll, muss entweder dieser Wert oder der Fehlercode innerhalb eines Referenztypparameters zurückgegeben werden. 7/27

Fehlercode als Referenzparameter Beispiel: Angenommen, die Methode doyourjob druckt das Ergebnis der Division a/b nicht aus, sondern liefert es als Ergebniswert zurück: public class Excep3 { public int int doyourjob(int a, a, int int b, b, int[] error) { if if ( b == == 0 ) { error[0] = -1; -1; return -1; -1; error[0] = 0; 0; return a/b; a/b; 8/27

Fehlercode als Referenzparameter public public static static void void main(string[] args) args) { Scanner Scanner scanner scanner = new new Scanner(System.in); System.out.print("a: "); "); int int a = scanner.nextint(); System.out.print("b: "); "); int int b = scanner.nextint(); Excep3 Excep3 instance instance = new new Excep3(); int[] int[] error error = new new int[1]; int[1]; int int ret ret = instance.doyourjob(a, b, b, error); error); if if ( error[0] error[0] == == -1-1 ){ ){ System.out.println("Fehlercode: " + error[0]); else else { System.out.println("a / b = " + ret); ret); System.out.println("Job done."); done."); 9/27

Fehlercode als Referenzparameter Alternative: Statt ein Feld zu verwenden könnte man eine Klasse definieren, die eine int-komponente für den Errorcode enthält. Fazit: Funktioniert, aber mühsam, unnatürlich und fehleranfällig Moderne Programmiersprachen, wie z.b. C++ und Java, verwenden Ausnahmen (exceptions) für die Fehlerbehandlung. 10/27

Ausnahmen / Exceptions Trennung von regulärem Code und Fehlerbehandlung. Wenn eine Ausnahmesituation eintritt z.b. Division durch 0 wird ein Exception-Objekt erzeugt und mit Informationen zur Fehlerursache und zum Ort des Auftretens initialisiert. Diese Informationen können über geeignete Instanzmethoden abgerufen werden. Exceptions werden nicht als reguläre Methodenrückgabewerte propagiert, sondern über einen speziellen Exception-Mechanismus. 11/27

Ausnahmen / Exceptions In Java ist jedes Exception-Objekt eine Instanz der Klasse java.lang.exception, oder einer Subklasse davon. Die Fehlerursache kann mit der Instanzmethode public String getmessage() abgerufen werden. Der Ort des Auftretens kann mit der Instanzmethode public String printstacktrace() abgerufen werden. Konsole java Excep1 Exception-Klasse a = 15 b = 0 java.lang.arithmeticexception: / by zero at Excep1.doYourJob(Excep1.java:10) getmessage() printstacktrace() 12/27

Abfangen von Exceptions Wenn eine Ausnahmesituation auftritt, wird eine Exception (Ausnahme) geworfen ("to throw an exception"). Exceptions können im Programm abgefangen werden ("to catch an exception"), um Abstürze zu vermeiden geeignete Fehlerbehandlung durchzuführen, etwa Meldung ausgeben (z.b. in einem geeigneten Fenster) Aufräumen bevor das Programm ordentlich terminiert wird. 13/27

Abfangen von Exceptions In Java geschieht dies durch eine Kombination von try und catch Anweisungen: Anweisungen, die fehlschlagen können, werden mit try eingeklammert; Die Fehlerbehandlung folgt in einem oder mehreren catch-blöcken. 14/27

Abfangen von Exceptions Beispiel: public public void void doyourjob() { Scanner Scanner scanner scanner = new new Scanner(System.in); System.out.print("a: "); "); int int a = scanner.nextint(); System.out.print("b: "); "); int int b = scanner.nextint(); try try { System.out.println("a/b = " + a/b); a/b); catch(arithmeticexception e) e) { System.out.println("Wir haben haben da da ein ein Problem: Problem: " + e.getmessage()); System.out.println( "Das "Das haetten haetten Sie Sie nicht nicht tun tun sollen..."); 15/27

Abfangen von Exceptions Konsole java Excep4 a: 15 b: 0 Wir haben da ein Problem: / by zero Das haetten Sie nicht tun sollen... Beachte: Das Programm terminiert nicht mehr automatisch, nachdem die Exception geworfen wurde! 16/27

Beispiel Daten aus Datei lesen Die Lösung in Java benötigt 2 Klassen aus dem Paket java.io, nämlich FileReader und BufferedReader. Eine Instanz der Klasse FileReader repräsentiert eine zum Lesen geöffnete Datei. Mit Hilfe der folgenden Zeile wird ein Objekt f vom Typ FileReader erzeugt, das Daten aus der Datei vals.txt lesen kann: FileReader f = new FileReader("vals.txt"); Beachte: Mit einem FileReader-Objekt kann man eine Datei nur zeichenweise einlesen. 17/27

Beispiel Daten aus Datei lesen Instanzen der Klasse BufferedReader erlauben, Dateien zeilenweise einzulesen. Die folgende Anweisung erzeugt ein solches Objekt unter Verwendung des zuvor erzeugten FileReader-Objekts: BufferedReader b = new BufferedReader(f); Beide Anweisungen können zusammengefasst werden: BufferedReader b = new BufferedReader(new FileReader("vals.txt")); Damit sieht der 1. Lösungsversuch wie folgt aus: 18/27

Beispiel Daten aus Datei lesen import java.io.*; public class Mittelwert { private static int anzahl = 0; 0; public static int parse(string s) s) { anzahl++; return Integer.parseInt(s); Fortsetzung auf nächster Folie 19/27

Beispiel Daten aus Datei lesen public static void void main(string[] args) { Scanner scanner = new new Scanner(System.in); System.out.print("Dateiname: "); "); String filename = scanner.next(); BufferedReader datei = new new BufferedReader(new FileReader(fileName)); double mittel = 0.0; 0.0; String line line = datei.readline(); while ( line line!=!= null null ) { mittel += += parse(line); line line = datei.readline(); mittel /= /= anzahl; Fortsetzung System.out.println("Mittelwert: auf nächster Folie " + mittel); 20/27

Beispiel Daten aus Datei lesen Aber: Der Versuch, die Klasse zu übersetzen (javac Mittelwert.java) liefert folgende Fehlermeldung: Mittelwert.java:16: unreported exception java.io.filenotfoundexception; must must be be caught caught or or declared declared to to be be thrown thrown new new BufferedReader(new FileReader(fileName)); ^ Mittelwert.java:18: unreported exception java.io.ioexception; must must be be caught caught or or declared declared to to be be thrown thrown String String line line = datei.readline(); ^ Mittelwert.java:21: unreported exception exception java.io.ioexception; must must be be caught caught or or declared declared to to be be thrown thrown line line = datei.readline(); ^ 21/27

Beispiel Daten aus Datei lesen public static void void main(string[] args) { Scanner scanner = new new Scanner(System.in); System.out.print("Dateiname: "); "); String filename = scanner.next(); BufferedReader datei = new new BufferedReader(new FileReader(fileName)); double mittel = 0.0; 0.0; String line line = datei.readline(); while ( line line!=!= null null ) { mittel += += parse(line); line line = datei.readline(); mittel /= /= anzahl; System.out.println("Mittelwert: " + mittel); FileNotFoundException möglich IOException möglich 22/27

Beispiel Daten aus Datei lesen Mögliche Lösung: throws-klausel im Kopf der main-methode: import import java.io.*; import import java.util.scanner; public public class class Mittelwert2 { private private static static int int anzahl anzahl = 0; 0; public public static static int int parse(string s) s) { public public static static void void main(string[] args) args) throws throws FileNotFoundException, IOException {...... Effekt: Reicht die Exception durch zur aufrufenden Methode, in diesem Fall das Java-Laufzeitsystem, das das Programm mit einer Fehlermeldung abbricht. 23/27

Beispiel Daten aus Datei lesen Konsole java java Mittelwert2 Datei: bals.txt Exception in in thread "main" java.io.filenotfoundexception: bals.txt (Das (Das System kann kann die die angegebene Datei nicht nicht finden) at at java.io.fileinputstream.open(native Method) at at java.io.fileinputstream.<init>(unknown Source) at at java.io.fileinputstream.<init>(unknown Source) at at java.io.filereader.<init>(unknown Source) at at Mittelwert.main(Mittelwert2.java:16) 24/27

Beispiel Daten aus Datei lesen Alternative: Exceptions abfangen public public static static void void main(string[] main(string[] args) args) { BufferedReader BufferedReader datei datei = null; null; Scanner Scanner scanner scanner = new new Scanner(System.in); boolean boolean success; success; do do { System.out.println("Dateiname: "); "); String String filename filename = scanner.next("dateiname: "); "); System.out.println("Datei: " + filename); filename); try try { datei datei = new new BufferedReader(new BufferedReader(new FileReader(fileName)); success success = true; true; catch catch ( FileNotFoundException e ) { success success = false; false; while while (!success!success ); ); 25/27

Beispiel Daten aus Datei lesen double double mittel mittel = 0.0; 0.0; try try { String String line line = datei.readline(); while while ( line line!=!= null null ) { mittel mittel += += parse(line); line line = datei.readline(); mittel mittel /= /= anzahl; anzahl; System.out.println("Mittelwert: " + mittel); mittel); catch catch ( IOException e ) { System.out.println("Fehler beim beim Einlesen"); System.exit(0); 26/27

Erzeugen von Exceptions Mit der throw-anweisung können Exceptions auch selbst ausgelöst werden: throw <Exception> Syntaxregel Beispiel: if if (param (param <= <= 0){ 0){ Exception newexception = new new IllegalArgumentException( "Parameter "Parameter muss muss größer größer Null Null sein"); sein"); throw throw newexception; 27/27