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

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

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

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

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

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

Java Fehlerbehandlung

Javakurs für Anfänger

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

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

3. Exceptions. Hintergrund: Programmieren auf der Basis von Verträgen. Kundenklasse. Lieferantenklasse

5.13 Umgang mit Fehlern

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Einführung in die Programmierung Blockkurs Java

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Java I Vorlesung Exceptions

Kapitel 6. Vererbung

Javakurs zu Informatik I. Henning Heitkötter

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 18: Exceptions II

Grundlagen der Informatik für Ingenieure I

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Vorlesung Programmieren

Vererbung. Martin Wirsing. Ziele. Vererbung

9. Fehlerbehandlung Advanced Programming Techniques. Wintersemester 2009 / 2010 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Objektorientierte Programmierung. Kapitel 18: Exceptions II

7. Übung zu Algorithmen und Datenstrukturen

Programmieren in Java

Fehler die bei der Programmerstellung passieren können teilweise vom Compiler erkannt werden

3. Anweisungen und Kontrollstrukturen

Exceptions: Parameterprüfung import java.io.ioexception;

II.1.1. Erste Schritte - 1 -

Distributed Computing Group

1 Polymorphie (Vielgestaltigkeit)

Grundlagen der Informatik Ausnahmebehandlung & Threads

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Primitive Datentypen

SEP 114. Design by Contract

Repetitorium Informatik (Java)

Beispiel: DB-Mock (1/7)

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Programmieren in Java

14. Tutorium zu Programmieren

1. Sei der String s = new String( xyzzy ) gegeben. Welcher Aufruf verändert s?

Kapitel 14. Systemarchitektur

Musterlösungen zur Klausur Informatik 3

Java Einführung Methoden. Kapitel 6

Java-Schulung Grundlagen

5.4 Klassen und Objekte

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

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Nachholklausur (6 ECTS) Einführung in die Informatik: Programmierung und Software-Entwicklung. Nachname... Vorname... Matrikelnummer... Studienfach...

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Nachholklausur (6 ECTS): Lösungsvorschlag Einführung in die Informatik: Programmierung und Software-Entwicklung. Nachname... Vorname...

Überblick und Wiederholung

Objektorientierte Programmierung

Programmieren I + II Regeln der Code-Formatierung

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Welche Informatik-Kenntnisse bringen Sie mit?

ihrer Klasse benötigt die Funktion einfuegenan:

Programmieren I. Kapitel 5. Kontrollfluss

Remote Method Invocation

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Probeklausur: Programmierung WS04/05

von Anja Austermann Drag and Drop

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Java Cheatsheet. Mehrzeiliger Kommentar (beginnt mit /* und endet mit */)

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Einführung in die Programmierung

Vorlesung Programmieren

Gebundene Typparameter

5 Grundlagen der Java-Syntax

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Delegatesund Ereignisse

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java.

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

JAVA - Methoden

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 8. Arrays. Arrays

Nachholklausur (9 ECTS) Einführung in die Informatik: Programmierung und Software-Entwicklung. Nachname... Vorname... Matrikelnummer... Studienfach...

Programmieren in Java

Sequenz Verzweigung (Selektion, Auswahl) Schleife (Repetition, Wiederholung)

am Beispiel von JUnit

3. Grundlegende Sprachkonstruktionen imperativer Programme

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Java Einführung Abstrakte Klassen und Interfaces

// Zeigt den insgesamt einbezahlten Betrag auf der Bank. // Muss 1600 GE sein. System.out.println("Current Bank balance: " + b.

Selbsteinstufungstest Vorkurs Programmieren

Datenbankanwendungsprogrammierung Crashkurs Java

Informatik II. /* c) Baumstruktur in einen String schreiben und zurueckgeben */ public String tostring() {

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Transkript:

1 Kapitel 11

Ziele 2 Fehlerquellen in Programmen und bei der Programmausführung verstehen Das Java-Konzept der Ausnahmen als Objekte kennenlernen Ausnahmen auslösen können Ausnahmen behandeln können

Fehlerhafte Programme 3 Ein Programm kann aus vielen Gründen unerwünschtes Verhalten zeigen. Logische Fehler beim Entwurf, d.h. bei der Modellierung des Problems: Entwurf entspricht nicht den Anforderungen. Fehler bei der Umsetzung des Entwurfs in ein Programm. Programm entspricht nicht dem Entwurf (logischer Programmierfehler), Algorithmen falsch implementiert (logischer Programmierfehler), Programm bricht ab wegen vermeidbarem Laufzeitfehler; z.b. Division durch 0, falscher Arrayzugriff, Ungenügender Umgang mit außergewöhnlichen Situationen, die nicht vermieden werden können. Fehlerhafte Benutzereingaben, z.b. Datum 31.11.2010 Fehlerhafter Dateizugriff, Abbruch der Netzwerkverbindung,

Robuste Programme 4 Wir beschäftigen uns hier nicht damit, wie man logische Fehler in einem Programm finden kann. Wir konzentrieren uns hier auf das Erkennen, Vermeiden und Behandeln von Ausnahmesituationen, die zu Laufzeitfehlern führen können. Unser Ziel ist es robuste Programme zu schreiben. Definition: Ein Programm heißt robust, falls es auch beim Auftreten von Fehlern sinnvoll reagiert.

5 Beispiel: Berechnung der Fakultät. Ausnahmesituationen erkennen (1) class MyClass { public static int fact(int n) { if (n == 0) return 1; else return n * fact(n-1); class Test { public static void main(string args[]) { int m = ; int k = MyClass.fact(m); System.out.println("Fakultät von " + m + " ist " + k); Es kann zu Nichtterminierung kommen. Diese Ausnahmesituation wird in der Methode fact nicht erkannt.

Beispiel: Berechnung der Fakultät. Ausnahmesituationen erkennen (2) 6 class MyClass { public static int fact_1(int n) { if (n < 0) return -1; else if (n == 0) return 1; else return n * fact(n-1); class Test { public static void main(string args[]) { int m = ; int k = MyClass.fact_1(m); System.out.println("Fakultät von " + m + " ist " + k); Eine Ausnahmesituation wird in der Methode fact_1 zwar erkannt, aber nicht adäquat an den Aufrufer gemeldet.

Beispiel: Berechnung der Fakultät. class MyClass { public static int fact_2(int n) { if (n < 0) throw new IllegalArgumentException("Eingabe darf nicht kleiner als 0 sein."); if (n == 0) return 1; else return n * fact(n-1); Ausnahme auslösen class Test { public static void main(string args[]) { int m = ; int k = MyClass.fact_2(m); System.out.println("Fakultät von " + m + " ist " + k); Eine Ausnahmesituation wird in der Methode fact_2 erkannt und es wird eine Ausnahme ausgelöst ( geworfen ). Die Ausnahme enthält eine individuelle Information, die die Fehlersituation beschreibt. Wird eine Ausnahme ausgelöst, dann werden die Methode und das Programm abgebrochen und die Fehlermeldung wird auf der Konsole gemeldet. Alternativ kann die Ausnahme auch behandelt werden (vgl. später). 7

Beispiel: Berechnung der Fakultät. class MyClass { public static int fact_2(int n) { if (n < 0) throw new IllegalArgumentException("Eingabe darf nicht kleiner als 0 sein."); if (n == 0) return 1; else return n * fact(n-1); Vermeiden von Ausnahmen class Test { public static void main(string args[]) { int m = ; if (m >= 0) { int k = MyClass.fact_2(m); System.out.println("Fakultät von " + m + " ist " + k); Die Ausnahmesituation wird hier vermieden, indem die main-methode vor dem Aufruf der Methode fact_2 testet, ob das Argument größer gleich 0 ist. Es kann (diesbezüglich) keine Ausnahme mehr ausgelöst werden. Die Methode fact_2 beinhaltet jedoch weiterhin eine Ausnahmeerkennung mit Ausnahmeauslösung, da sie nicht sicher ist, ob sie korrekt aufgerufen wird ( defensive Programmierung). 8

Fehler- und Ausnahmenklassen in Java 9 In Java unterscheidet man zwischen Fehlern und Ausnahmen, die beide durch Objekte repräsentiert werden. Fehler sind Instanzen der Klasse Error Ausnahmen sind Instanzen der Klasse Exception Fehler deuten auf schwerwiegende Probleme der Umgebung hin und können nicht sinnvoll behandelt werden, z.b. OutOfMemoryException. Ausnahmen können vom Programmierer im Programm durch Ausnahmebehandlung abgefangen werden.

Vererbungshierarchie der Fehlerklassen Object Alle Fehler- und Ausnahmeobjekte sind von Throwable abgeleitet. 10 schwerwiegende Fehler Throwable Ausnahmen Error Exception Ausnahmen, die nicht behandelt werden müssen OutOfMemoryException... RuntimeException IOException... IllegalArgumentException ArithmeticException... NullPointerException IndexOutOfBoundsException Beispiel für eine checked Exception

Die Klasse Error und ihre direkten Subklassen 11

Die Klasse Exception und ihre direkten Subklassen 12

Die Klasse RuntimeException und ihre direkten Subklassen 13

Die Klasse Throwable 14 Ausnahme- und Fehler-Objekte enthalten Informationen über Ursprung und Ursache des Fehlers. Die Klasse Throwable, von der alle Fehlerklassen abgeleitet sind, verwaltet solche Informationen, z.b.: eine Nachricht zur Beschreibung des aufgetretenen Fehlers einen Schnappschuss des Aufrufstacks zum Zeitpunkt der Erzeugung des Objekts Nützliche Methoden in Throwable: String getmessage(): gibt die Fehlermeldung zurück void printstacktrace(): gibt den Aufrufstack des Fehlers aus

Auslösung einer RuntimeException und Ausgabe des Aufrufstacks public class Div0 { /** Die Methode m loest wegen der Division durch 0 * eine ArithmeticException aus: */ public static void m() { int d = 0; int a = 42 / d; System.out.println("d= " + d); System.out.println("a= " + a); public static void main(string args[]) { this.m(); Java-Ausgabe mit Aufrufstack: Exception in thread "main" java.lang.arithmeticexception: / by zero at Div0.m(Div0.java:6) at Div0.main(Div0.java:11) Der Aufrufstack enthält die Folge der Methodenaufrufe, die zum Fehler geführt haben. 15

Kontrolliertes Auslösen von Ausnahmen 16 Mittels der throw-anweisung kann man eine Ausnahme auslösen. Syntax: throw exp; Der Ausdruck exp muss eine Instanz einer von Throwable abgeleiteten Klasse (d.h. eine Ausnahme oder ein Fehlerobjekt) bezeichnen. Beispiel: throw new IllegalArgumentException(" "); Die Ausführung einer throw-anweisung stoppt den Kontrollfluss der Methode und löst die von exp definierte Ausnahme aus. Die nachfolgenden Anweisungen im Rumpf der Methode werden nicht mehr ausgeführt (wie bei return). Es kommt zu einem Abbruch des Programms, wenn die Ausnahme nicht in einer übergeordneten Methode abgefangen und behandelt wird.

Geprüfte Ausnahmen (Checked Exceptions) 17 Geprüfte Ausnahmen sind in Java alle Instanzen der Klasse Exception, die nicht Objekte der Klasse RuntimeException sind. Gibt es in einem Methodenrumpf eine throw-anweisung mit einer geprüften Ausnahme, dann muss das im Methodenkopf mit throws explizit deklariert werden. Geprüfte Ausnahmen müssen vom Aufrufer der Methode entweder behandelt werden oder wieder im Methodenkopf deklariert werden. Beispiele: import java.io.ioexception; public void m() throws IOException { if ( ) { throw new IOException(); public void n() throws IOException { this.m(); Man muss deklarieren, dass in dieser Methode die Ausnahme IOException auftreten kann. Da die IOException, die beim Aufruf von m() auftreten kann, hier nicht behandelt wird, muss die Methode selbst wieder eine throws-klausel deklarieren

Ungeprüfte Ausnahmen (Unchecked Exceptions) 18 Ungeprüfte Ausnahmen sind genau die Instanzen von RuntimeException. Beispiele: ArithmeticException, NullPointerException, Ungeprüfte Ausnahmen müssen nicht im Methodenkopf explizit deklariert werden (sie können es aber). Ungeprüfte Ausnahmen müssen nicht behandelt werden (sie können es aber).

19 Benutzerdefinierte Ausnahmeklassen Mittels Vererbung kann man eigene Ausnahmeklassen definieren. Beispiel: Klassen BankKonto und SparKonto. Es soll nicht möglich sein, ein SparKonto zu überziehen. Wir definieren dazu eine (checked) Exception, die beim Versuch das SparKonto zu überziehen, geworfen werden soll: public class KontoUngedecktException extends Exception { private double abhebung; public KontoUngedecktException(String msg, double abhebung) { super(msg); // Konstruktor von Exception nimmt Nachricht this.abhebung = abhebung; public double getabhebung() { return abhebung;

Auslösen einer benutzerdefinierten Ausnahme 20 public class BankKonto { public void abheben(double x) throws KontoUngedecktException { kontostand = kontostand - x; public class SparKonto extends BankKonto { public void abheben(double x) throws KontoUngedecktException { if (getkontostand() < x) { throw new KontoUngedecktException("Sparkonten dürfen nicht überzogen werden.", x); super.abheben(x);

21 Behandlung von Ausnahmen Ausnahmebehandlung geschieht in Java mit Hilfe der try-anweisung. Damit können Ausnahmen abgefangen werden. try { // Block fuer normalen Code catch (Exception1 e) { // Ausnahmebehandlung fuer Ausnahmen vom Typ Exception1 catch (Exception2 e) { // Ausnahmebehandlung fuer Ausnahmen vom Typ Exception2 Zunächst wird der try-block normal ausgeführt. Tritt im try-block keine Ausnahmesituation auf, so werden die beiden Blöcke zur Ausnahmebehandlung ignoriert. Tritt im try-block eine Ausnahmesituation auf, so wird die Berechnung dieses Blocks abgebrochen. Ist die Ausnahme vom Typ Exception1 oder Exception2, so wird der Block nach dem jeweiligen catch ausgeführt. Ansonsten ist die Ausnahme unbehandelt.

Behandlung von Ausnahmen: Beispiel Konto 22 public static void main(string[] args) { SparKonto konto = new SparKonto(5, 1); // 5 Euro, 1% Zinsen String einlesebetrag = JOptionPane.showInputDialog("Betrag zum Abheben?"); double betrag = Double.parseDouble(einleseBetrag); try { konto.abheben(betrag); catch (KontoUngedecktException e) { System.out.println(e.getMessage()); System.out.println("Der Abhebungsbetrag " + e.getabhebung() + " war zu hoch. ");

Behandlung von Ausnahmen: finally 23 Manchmal möchte man nach der Ausführungs eines try-blocks bestimmte Anweisungen ausführen, egal ob eine Ausnahme aufgetreten ist. Beispiel: Schließen einer im try-block geöffneten Datei. Das kann man mit einem finally-block erreichen, der in jedem Fall nach dem try-block und der Ausnahmebehandlung ausgeführt wird. try { // Block fuer normalen Code catch (Exception1 e) { // Ausnahmebehandlung fuer Ausnahmen vom Typ Exception1 catch (Exception2 e) { // Ausnahmebehandlung fuer Ausnahmen vom Typ Exception2 finally { // Code, der in jedem Fall nach normalem Ende und nach // Ausnahmebehandlung ausgefuehrt werden soll.

Beispiel für finally 24 Ablauf in einem Geldautomaten: public static void main(string[] args) { SparKonto konto = new SparKonto(5, 1); // 5 Euro, 1% Zinsen String einlesebetrag = JOptionPane.showInputDialog("Betrag zum Abheben?"); double betrag = Double.parseDouble(einleseBetrag); try { konto.abheben(betrag); catch (KontoUngedecktException e) { System.out.println(e.getMessage()); System.out.println("Der Abhebungsbetrag " + e.getabhebung() + " war zu hoch. "); finally { System.out.println("Bitte entnehmen Sie ihre Karte.");

Ausnahmebehandlung bei fehlerhafter GUI-Eingabe (1) 25 public class ExceptionTestFrame extends JFrame implements ActionListener { private JButton testbutton; private JTextArea ausgabebereich; public ExceptionTestFrame() {... this.testbutton.addactionlistener(this); public void actionperformed(actionevent e) { Object source = e.getsource(); if (source == this.testbutton) { this.test();

26 Ausnahmebehandlung bei fehlerhafter GUI-Eingabe (2) private void test() { int wert = 0; boolean inputok = false; while (!inputok) { String einlesewert = JOptionPane.showInputDialog("Wert?"); try { wert = Integer.parseInt(einleseWert); inputok = true; catch (NumberFormatException e) { this.ausgabebereich.settext("falsche Eingabe: Kein Integer!"); //Ende while this.ausgabebereich.settext("eingabe war " + wert); //Ende Methode test //Ende Klasse ExceptionTestFrame

Beispiel: Lesen von der Standardeingabe (Konsole) Eine robuste Methode zum Einlesen einer Zeile von der Konsole: 27 public static String readstring() { Klasse mit Operationen zur Verarbeitung von Textströmen BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); while (true) { try { return in.readline(); Liest nächste Zeile aus Eingabestrom Konvertiert byte-strom in char-strom Datenstrom von Bytes von der Konsole catch (IOException e) { System.out.println("Fehler beim Einlesen: " + e.getmessage()); System.out.println("Versuchen Sie es nochmal!"); Bei einem IO-Fehler in in.readline() kommt die return-anweisung nicht zur Ausführung. Es wird stattdessen dieser Block zur Fehlerbehandlung ausgeführt und dann wird mit der while-schleife weitergemacht (d.h. die Eingabe wiederholt).

28 Zusammenfassung Ausnahmen werden in Java durch Objekte dargestellt. Methoden können Ausnahmen auslösen implizit durch einen Laufzeitfehler oder explizit mit throw und damit abrupt terminieren. Ausnahmen können mit catch behandelt werden, so dass sie nicht zu einem Abbruch des Programms führen. Wir unterscheiden geprüfte und ungeprüfte Ausnahmen. Geprüfte Ausnahmen müssen abgefangen werden oder im Kopf der Methode wiederum deklariert werden. In jedem Fall ist es am Besten Ausnahmen zu vermeiden. Defensive Programme sehen auch für vermeidbare Ausmahmesituationen das Werfen von Ausnahmen vor (was dann hoffentlich nie nötig ist).