der Universität Oldenburg

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
der Universität Oldenburg
der Universität Oldenburg
Imperative Programmierung
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
Einführung in die Programmierung Ausführbare Klassen
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
Imperative Programmierung -Entwicklungswerkzeuge
der Universität Oldenburg
der Universität Oldenburg
der Universität Oldenburg
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Listen Richard Göbel.
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
IF-ELSE-IF-Ketten Weiter mit PP..
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Exceptions. import java.sql.*; public class MyException{ boolean b; Statement stat; public MyException(){ b = stat.execute("xyz"); } Beim Übersetzen dieses.
DO...WHILE Anweisung.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Imperative Programmierung Funktionen und Parameter
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Projektplan: Fachgebiet Software Engineering Übersicht © Albert Zündorf, Kassel University.
DVG Ausnahmen. DVG Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Ausnahmen1 Ausnahmen. DVG Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Thema: Fibonacci-Zahlen
Bestimmung des ggT zweier Zahlen
Verzweigung.
Vererbung Einfache Vererbung – Erben von abstrakten Klassen – Implementieren eines Interfaces.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Rekursive Funktionen (Fakultät)
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Grundlagen der Programmierung
Telecooperation/RBG Technische Universität Darmstadt Copyrighted material; for TUD student use only Grundlagen der Informatik I Thema 16: Ausnahmebehandlung.
Objektorientiertes Konstruieren
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Programmierung von Agenten in Java: Implementierung einer Supply-Chain
Programmiervorkurs WS 2014/15 Methoden
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Robuste Programme durch Ausnahmebehandlung
© 2004 Pohlig Informatik Kurse © 2004 Pohlig Informatik Kurse Der Tramp tanzt die Rekursion zünderUntersuchen(…) Basisfall Rückmeldung:
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Java Programme nur ein bisschen objektorientiert.
Implementieren von Klassen
 Präsentation transkript:

der Universität Oldenburg Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 14 Dietrich Boles

Gliederung von Vorlesung 14 Fehlerbehandlung Motivation Fehlerarten Fehlerquellen traditionelle Fehlerbehandlung Fehlerbehandlung in Java Fehlerklassen Fehlertypdeklaration „Werfen“ von Fehlerobjekten „Abfangen“ von Fehlerobjekten catch-Block finally-Block Anmerkungen Dokumentation Motivation javadoc Konventionen für die Bezeichnerbenennung

Fehlerbehandlung / Motivation public class Mathematik { public static int fak(int n) { if (n > 0) return n * fak(n-1); else return 1; // falsch, wenn n < 0 (nicht def.) } public static double div(double wert, double durch) { if (durch != 0.0) return wert/durch; else return 0.0; // eigentlich falsch (unendlich) } } public class Berechnungen { public static void main(String[] args) { double eingabe = Terminal.readDouble(); System.out.println(fak(eingabe)); System.out.println(div(eingabe, eingabe-2.0));

Fehlerbehandlung / Fehlerarten „Schwere“ Fehler  Programmabbruch „leichte“ Fehler  Korrektur „schwer“ / „leicht“ unter Umständen situationsabhängig Beispiel: Division durch 0 Programmabbruch Aufforderung zur „Neueingabe“ weitere Frage: Wer soll auf Fehler reagieren? Programmierer einer Funktion Aufrufende einer Funktion

Fehlerbehandlung / Fehlerquellen Inkonsistente Variablenwerte ungültige Parameterwerte falsche Adressen / Dateinamen nicht erfüllte Vorbedingungen (lesen erst nach Öffnen einer Datei) ungültiger Array-Index Zugriff auf null-Objekt arithmetische Fehler kein Speicherplatz mehr vorhanden Endlosrekursion ...

Fehlerbehandlung / traditionelle Methoden Ausgabe einer Fehlermeldung: public class Mathematik { public static int fak(int n) { if (n > 0) return n * fak(n-1); else if (n == 0) return 1; System.err.println(“ungueltiger Parameter“); return -1; } } public class Berechnungen { public static void main(String[] args) { int eingabe = Terminal.readInt(); System.out.println(fak(eingabe)); Problem: Aufrufendes Programm bekommt den Fehler nicht mit!

Fehlerbehandlung / traditionelle Methoden Benutzung einer error-Variablen: public class Mathematik { public static final int NOERROR = 0; public static final int INVALID = 1; public static int error; public static int fak(int n) { if (n > 0) { error = NOERROR; return n*fak(n-1); } if (n == 0) { error = NOERROR; return 1; } error = INVALID; return -1; } } main: int eingabe = Terminal.readInt(); int result = fak(eingabe); if (Mathematik.error == Mathematik.NOERROR) System.out.println(result); else if (Mathematik.error == Mathematik.INVALID) System.err.println(“ungueltiger Parameter“); ... Problem: Ausgesprochen umständlich!

Fehlerbehandlung in Java / Überblick Bei der Klassen-/Methodendefinition: überlegen, was für Fehler auftreten können Definition und Implementierung geeigneter „Fehlerklassen“ Erweiterung der Methodensignatur um Angabe möglicher Fehler erzeugen und liefern („werfen“) von „Fehlerobjekten“ im Falle eines Fehlereintritts Bei der Klassen-/Methodennutzung: beim Aufruf einer Methode ermitteln, welche Fehler prinzipiell auftreten können zunächst „versuchen“, die Methode auszuführen falls kein Fehler auftritt, normal weitermachen falls ein Fehler auftritt, das Fehlerobjekt abfangen und geeignete Fehlerbehandlung einleiten

Fehlerbehandlung in Java / Überblick überlegen, was für Fehler auftreten können public static int fak(int n) { if (n > 0) return n * fak(n-1); else if (n == 0) return 1; else ???????? } Fehlerquelle: ungültiger aktueller Parameterwert (n < 0)

Fehlerbehandlung in Java / Überblick Definition und Implementierung geeigneter „Fehlerklassen“ public class InvalidParameter extends Exception { int act_param_value; public InvalidParameter(int value) { super(“Ungültiger Parameter“); this.act_param_value = value; } public int getParamValue() { return this.act_param_value;

Fehlerbehandlung in Java / Überblick Erweiterung der Methodensignatur um Angabe möglicher Fehler erzeugen und liefern („werfen“) von „Fehlerobjekten“ im Falle eines Fehlereintritts public static int fak(int n) throws InvalidParameter { if (n > 0) return n * fak(n-1); else if (n == 0) return 1; else { InvalidParameter error_obj = new InvalidParameter(n); throw error_obj; } }

Fehlerbehandlung in Java / Überblick beim Aufruf einer Methode ermitteln, welche Fehler prinzipiell auftreten können public static void do_something() { int eingabe = Terminal.readInt(); int result = fak(eingabe); for (int i=0; i<result; i++) System.out.println(i); } möglicher Fehler: ungültiger aktueller Parameterwert für fak-Aufruf (eingabe < 0)

Fehlerbehandlung in Java / Überblick zunächst „versuchen“, die Methode auszuführen falls kein Fehler auftritt, normal weitermachen public static void do_something() { try { int eingabe = Terminal.readInt(); int result = fak(eingabe); for (int i=0; i<result; i++) System.out.println(i); }

Fehlerbehandlung in Java / Überblick falls ein Fehler auftritt, das Fehlerobjekt abfangen und geeignete Fehlerbehandlung einleiten public static void do_something() { try { int eingabe = Terminal.readInt(); int result = fak(eingabe); for (int i=0; i<result; i++) System.out.println(i); } catch (InvalidParameter error_obj) { System.err.println(“ungültige Eingabe: “ + error_obj.getParamValue() + “wiederholen“); do_something(); } }

Fehlerklassen Object Error: schwerwiegende Fehler Runtime: schwerwiegende Fehler möglichst neue Fehlerklassen nicht von Error und Runtime ableiten neue Fehlerklassen i.a. von Exception ableiten! Fehlerobjekte (Exceptions) sind Objekte von Fehlerklassen (von Throwable (zumeist indirekt) abgeleitete Klassen!) Throwable Error Exception OutOfMemoryError ... RuntimeException ... ArithmeticException ...

Fehlerklassen package java.lang; public class Exception extends Throwable { // Konstruktoren public Exception(); public Exception(String message); // Methoden public String getMessage(); // liefert message public String toString(); // ruft getMessage auf }

Fehlertypdeklaration Deklaration von Fehlertypen einer Methode in der Methodensignatur mittels des Schlüsselwortes throws Eine Methode muß alle Fehlertypen deklarieren, die sie werfen kann, (oder sie muß sie selbst „abfangen“) (Fehlerobjekte werden „weitergeleitet“) Error- und RuntimeException-Fehler müssen nicht unbedingt deklariert werden public class Ex1 extends Exception {} public class Ex2 extends Exception {} public int f() throws Ex1, Ex2 { ... if (...) throw new Ex1(); ... ... if (...) throw new Ex2(); ... } public int g() throws Ex1 { try { ... int i = f(); ... } catch (Ex2 e) {...}

Fehlertypdeklaration Die Fehlertypdeklaration gehört mit zur Signatur einer Methode Werden Methoden mit Fehlertypen in abgeleiteten Klassen überschrieben, dann müssen die Fehlertypdeklarationen übereinstimmen oder es müssen Fehlerklassen angegeben werden, die von den Fehlerklassen der überschriebenen Methode abgeleitet sind! public class Ex1 extends Exception {} public class Ex2 extends Exception {} public class Ex3 extends Ex2 {} public class A { public int f(float v) throws Ex1, Ex2 { ... } } public class B extends A { // nur eine der Alternat. public int f(float v) throws Ex1, Ex3 { ... }

„Werfen“ von Fehlerobjekten „Werfen“ von Fehlerobjekten mittels des Schlüsselwortes throw nach dem Werfen eines Fehlerobjektes wird eine Methode (wie beim return) direkt verlassen Es können nur Objekte solcher Fehlerklassen geworfen werden, die auch in der Methodendeklaration aufgeführt sind public class InvalidParam extends Exception {} public class Math { public static int fak(int n) throws InvalidParam { if (n < 0) throw new InvalidParam(); if (n == 0) return 1; return n * fak(n-1); }

„Abfangen“ von Fehlerobjekten Methoden, die (andere) Methoden aufrufen, die Fehlerobjekte werfen können, können diese entweder weiterleiten (an die aufrufende Methode dieser Methode) oder sie müssen sie abfangen (und behandeln) Zum Abfangen eines Fehlerobjektes muß die entsprechende Methode innerhalb eines sogenannten try-Blockes aufgerufen werden Die Fehlerbehandlung wird in einem sogenannten „den Fehlertyp matchenden“-catch-Block durchgeführt wird ein Fehlerobjekt geworfen, so wird die Bearbeitung des try-Blockes unmittelbar beendet existiert ein matchender-catch-Block, werden die Anweisungen dieses Blockes ausgeführt existiert ein sogenannter finally-Block, wird dieser auf jeden Fall ausgeführt wird ein Fehlerobjekt während der Abarbeitung eines try-Blockes geworfen und existiert kein matchender-catch-Block, so wird falls vorhanden der finally-Block ausgeführt und anschließend die Methode sofort verlassen und das Fehlerobjekt an die aufrufende Methode weitergeleitet

„Abfangen“ von Fehlerobjekten public int f(double v) throws Ex1, Ex2, Ex3 { ... } public float g(int i) throws Ex1, Ex3, Ex4 { ... } public void h() throws Ex3 { ... (*1) try { ... (*2) int r = f(2.0); ... (*3) float x = g(r); ... (*4) } catch (Ex1 error_ex1) { ... (*5) } catch (Ex2 error_ex2) { ... (*6) } catch (Ex4 error_ex4) { ... (*7) } finally { ... (*8) } ... (*9)

„Abfangen“ von Fehlerobjekten Erläuterungen (zum Beispiel vorher): (1)wird die Funktion h (bspw. von einer Funktion s) aufgerufen, dann wird zunächst (*1) ausführt (2)anschließend wird (*2) ausgeführt (3)wird während der Ausführung der Funktion f kein Fehlerobjekt geworfen, dann wird (*3) ausgeführt (weiter bei (6)) (4)wird während der Ausführung der Funktion f ein Fehlerobjekt vom Typ Ex3 geworfen, dann wird zunächst (*8) ausgeführt und danach die Funktion h unmittelbar verlassen und das Fehlerobjekt an die aufrufende Funktion s weitergeleitet (5)wird während der Ausführung der Funktion f ein Fehlerobjekt vom Typ Ex1 (oder Ex2) geworfen, dann wird dieses Objekt (wie bei der Parameterübergabe) als aktueller Parameter dem formalen Parameter error_ex1 (bzw. error_ex2) übergeben und (*5) (bzw. (*6)) ausgeführt (weiter bei (10))

„Abfangen“ von Fehlerobjekten (6)nach der Ausführung von (*3) wird die Funktion g aufgerufen (7)wird während der Ausführung der Funktion g kein Fehlerobjekt geworfen, dann wird (*4) ausgeführt (weiter bei (10)) (8)wird während der Ausführung der Funktion g ein Fehlerobjekt vom Typ Ex3 geworfen, dann wird zunächst (*8) ausgeführt und danach die Funktion h unmittelbar verlassen und das Fehlerobjekt an die aufrufende Funktion s weitergeleitet (9)wird während der Ausführung der Funktion g ein Fehlerobjekt vom Typ Ex1 (oder Ex4) geworfen, dann wird dieses Objekt (wie bei der Parameterübergabe) als aktueller Parameter dem formalen Parameter error_ex1 (bzw. error_ex4) übergeben und (*5) (bzw. (*7)) ausgeführt (10)nach Ausführung von (*4), (*5), (*6) oder (*7) wird auf jeden Fall (*8) ausgeführt (11)anschließend wird (*9) ausgeführt und die Funktion beendet

catch-Block Sehr große Ähnlichkeiten zu Prozeduren und Parametern muß einem try-Block (oder einem anderen catch-Block) folgen „formale Parameter“ müssen Fehlerklassen/-Objekte sein, die im try-Block auftreten können (bzw. Oberklassen der Fehlerklassen ( Polymorphie)) die Fehlerobjektübergabe ist identisch zur Parameterübergabe bei Funktionen, d.h. insbesondere können die formalen Fehlerobjekte wie lokale Variablen des catch-Blockes behandelt werden; sie werden mit dem geworfenen Fehlerobjekt initialisiert wird während der Ausführung des try-Blockes ein Fehlerobjekt geworfen, so wird der try-Block verlassen, und es wird der Reihe nach (!) überprüft, ob ein catch-Block mit dem Fehlerobjekt matched; dabei gilt: ein catch-Block matched ein aktuelles Fehlerobjekt, wenn die Klasse seines formalen Fehlerobjektes gleich der Klasse oder eine Oberklasse des aktuellen Fehlerobjektes ist

finally-Block ist „parameterlos“ schließt einen try-{catch}*-Block ab, d.h. kann hinter einem bzw. einer Menge von catch-Blöcken definiert werden ist ein finally-Block hinter einem try-{catch}*-Block vorhanden, so wird dieser auf jeden Fall ausgeführt, d.h. wenn kein Fehlerobjekt im try-Block geworfen wurde wenn ein Fehlerobjekt im try-Block geworfen und nicht abgefangen wurde (nach dem finally-Block wird in diesem Fall die Funktion verlassen und das Fehlerobjekt an die aufrufenden Funktion weitergeleitet) wenn ein Fehlerobjekt im try-Block geworfen und abgefangen wurde, d.h. nach der Ausführung des matchenden catch-Blockes

Exceptions / Anmerkungen Fehlerquelle: werden während der Ausführung eines try-Blockes explizit Fehlerobjekte geworfen, können diese u.U. (d.h. es existiert ein matchender catch-Block) direkt wieder von einem catch-Block gefangen werden: class Ex1 extends Exception {} public void f() { try { ... throw new Ex1(); ... } catch (Exception obj) { ... } } es kann passieren, daß auch während der Abarbeitung eines catch-Blockes wieder Fehler auftreten ( Schachtelung): ... catch (Exception o) { try { ... } catch (Exception obj2) { ... } auch try-{catch}*finally-Blöcke lassen sich schachteln rücksichtsloses Abbrechen eines Programms: System.exit(0);

Dokumentation 2 Typen von Source-Code-Dokumentation: Dokumentation des Protokolls Dokumentation der Implementierung Motivation: Beschreibung der Funktionalität einer Klasse / Methode für andere Programmierer bessere Verständlichkeit der gewählten Algorithmen einfachere Fehlersuche und Fehlerbeseitigung einfachere Wartung, Änderbarkeit und Erweiterbarkeit des Codes Dokumentation der Implementierung in Java: aussagekräftige Bezeichner (Klassen / Methoden / Variablen) verwenden den Code gut strukturieren an „kritischen“ Stellen Zeilenkommentare einbauen

Dokumentation / javadoc javadoc: Werkzeug des JDK zur Generierung von HTML-Code zur Dokumentation des Protokolls einer oder mehrerer Klassen: Aufruf: javadoc <.java-Datei(en)> Voraussetzung: Verwendung von javadoc-Kommentaren und javadoc-Schlüsselwörtern javadoc-Kommentare: /** <zeichen> */ javadoc-Schlüsselwörter: Beschreibung von Klassen: Beschreibung der Funktionalität @version <text> @author <text> Beschreibung von Methoden: Vorbedingungen, Nachbedingungen @param <name> <beschreibung> @return <beschreibung> @exception <voller Klassenname> <Beschreibung>

javadoc-Beispiel package java.util; /** * Vector class (a growable array).<p> * * Each vector tries to optimize storage management by maintaining * a capacity and a capacityIncrement. The capacity is always at * least as large as the vector size; it is usually larger because * as elements are added to the vector, the vector's storage * increases in chunks the size of capacityIncrement. Setting * the capacity to what you want before inserting a large number of * objects will reduce the amount of incremental reallocation. * You can safely ignore the capacity and the vector will still work * correctly. * @version 1.29, 01 Dec 1995 * @author Jonathan Payne * @author Lee Boynton */ public class Vector implements Cloneable {

javadoc-Beispiel /** * The buffer where elements are stored. */ protected Object element_data[]; * The number of elements in the buffer. protected int element_count; * Constructs an empty vector with the specified storage * capacity. * @param initial_capacity the initial storage capacity of the * vector public Vector(int initial_capacity) { ... } * Constructs an empty vector. public Vector() { ... }

javadoc-Beispiel /** * Returns the element at the specified index. * @param index the index of the desired element * @return the element at the specified index * @exception ArrayIndexOutOfBoundsException If an invalid * index was given. */ public final synchronized Object elementAt(int index) { ... } * Sets the element at the specified index to be the specified * object. * The previous element at that position is discarded. * @param obj what the element is to be set to * @param index the specified index * @exception ArrayIndexOutOfBoundsException If the index was * invalid. public final synchronized void setElementAt(Object obj, int index) { ... }

Bezeichnerkonventionen Klassen: Anfangsbuchstaben jedes Wortteils groß DibosGobangProgramm ArrayIndexOutOfBoundsException Attribute / Variablen: keine Großbuchstaben; Trennung mehrere Wortteile durch Unterstrich (_) anzahl_an_zeichen maximale_groesse Methoden: Beginn mit Kleinbuchstaben; Anfangsbuchstaben weiterer Wortteile groß getNumber liefereNaechstenSpielzug Konstanten: ausschließlich Großbuchstaben; Trennung von Wortteilen durch Unterstrich (_) MAX_VALUE INVALID_PARAM