Einführung in die Programmierung mit Java

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

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

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

Kapitel 6. Vererbung

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

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Algorithmen und Datenstrukturen 07

5.13 Umgang mit Fehlern

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

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

3 Objektorientierte Konzepte in Java

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

Java Einführung Methoden in Klassen

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

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

3. Konzepte der objektorientierten Programmierung

5.5.8 Öffentliche und private Eigenschaften

3 Objektorientierte Konzepte in Java

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

Algorithmen und Datenstrukturen

Software Engineering Klassendiagramme Einführung

Einführung in Javadoc

Programmieren in Java

Probeklausur: Programmierung WS04/05

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Einführung in die Programmierung Blockkurs Java

Assoziation und Aggregation

Javakurs 2013 Objektorientierung

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

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

Objektorientierte Programmierung. Kapitel 18: Exceptions II

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

14. Tutorium zu Programmieren

Objektorientierte Programmierung. Kapitel 18: Exceptions II

1 Polymorphie (Vielgestaltigkeit)

Programmieren in Java

Große Übung Praktische Informatik 1

Von der UML nach C++

Java-Schulung Grundlagen

Datenbankanwendungsprogrammierung Crashkurs Java

Vererbung & Schnittstellen in C#

Java Einführung Abstrakte Klassen und Interfaces

Javakurs für Anfänger

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

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Klassenbeziehungen & Vererbung

Objekt-Orientierte Programmierung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

5.6 Vererbung. Vererbung

Inhalt: Version 1.7.5

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

7. Übung zu Algorithmen und Datenstrukturen

SEP 114. Design by Contract

Klassendiagramm. (class diagram)

von Anja Austermann Drag and Drop

Programmieren - Vererbung & Polymorphie

Objektorientierte Programmierung. Kapitel 12: Interfaces

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

1. Der Einstieg in Java. Was heißt Programmieren?

Repetitorium Informatik (Java)

Beispiel: DB-Mock (1/7)

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

Java Schulung (Java 2 Java Development Kit 5 / 6)

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Vorkurs C++ Programmierung

Code-Erzeugung aus UML-Klassendiagrammen

Java für Computerlinguisten

Java für C++ Programmierer

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

2.2 Prozesse in Java

5.4 Klassen und Objekte

Innere Klassen in Java

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

4. AuD Tafelübung T-C3

Vorlesung Programmieren. Unified Modeling Language (UML) Unified Modeling Language (UML) Unified Modeling Language (UML)

Vorlesung Programmieren

Musterlösungen zur Klausur Informatik 3

II.1.1. Erste Schritte - 1 -

Themen. Web Service - Clients. Kommunikation zw. Web Services

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

C# im Vergleich zu Java

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

Einführung in die Programmierung mit Java. Hörsaalübung

Java - Programmierung - Objektorientierte Programmierung 1

Abschnitt 9: Schnittstellen: Interfaces

Programmieren in Java

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Transkript:

Einführung in die Programmierung mit Java Teil 9: Unified Modeling Language Martin Hofmann Steffen Jost LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München Stack 7. Dezember 2017 p r q Heap Point x 4 y 5 Point x 4 y 5 Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.1

Teil 9: Unified Modeling Language 1 UML Diagramme Objektdiagramme Klassendiagramm Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.2

UML Objektdiagramme Klassendiagramm UML-Notation UML = Unified Modelling Language ISO Standard zur grafischen Veranschaulichung von Vorgängen bei der Softwareentwicklung: Objektdiagramme: visualisieren Speicherinhalt Klassendiagramme: visualisieren Klassen und ihre Beziehungen Use-case Diagramme: visualisieren Verwendungsszenarien Statecharts: visualisieren Zustandsübergänge... Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.3

UML UML Objektdiagramme Klassendiagramm UML-Diagramme werden primär als Strukturierungs- und Modellierunsmittel auf dem Weg von der informellen Beschreibung zum fertigen Programm eingesetzt: Welche Komponenten gibt es? Was leistet jede Komponente? Wie interagieren die Komponenten? Welche Abhängigkeiten gibt es? Die Ideen werden zuerst in Diagrammen festgehalten, diskutiert und anschließend danach implementiert. Nicht umgekehrt! Modellierung beinhaltet auch Abstraktion: Wenn z.b. ein Konstruktor nicht aufgelistet wird, dann kann man darauf schließen, dass dessen Verhalten gewöhnlich ist; gibt es Besonderheiten zu beachten, wird dieser im Diagramm aufgeführt. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.4

UML Objektdiagramme Klassendiagramm Speicherdiagramm aus den Übungen Diagramm zeigt alle vorhandenen Objekte im Speicher ( Heap ), und meistens noch alle lokale Variablen mit Inhalt ( Stack -Box). Jedes Objekt im Heap durch Box mit zwei Teilen repräsentiert: 1 Klassenname 2 Attribute (Instanzvariablen) mit aktuellem Inhalt Beziehung zwischen Objekten durch Pfeile dargestellt: für Referenzen, also Verweise auf andere Objekte Gut für erste Übungen, aber schnell umständlich bei vielen Objekten Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.5

UML Objektdiagramme Klassendiagramm UML Objektdiagramm Objektdiagramme sind ähnlich zu den in unseren Übungen verwendeten Speicherdiagrammen: Alle Objekte werden als zweigeteilte Rechtecke dargestellt. In der oberen Hälfte steht der Instanzname (falls vorhanden) und davon mit Doppelpunkt abgetrennt der unterstrichene Klassenname. In der unteren Hälfte steht eine Auswahl von Attributen des Objekts mit ihren Werten. Anstelle von Pfeilen wird eine einfache Linie verwendet, an deren Spitze der Name des Attributs steht. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.6

UML Objektdiagramme Klassendiagramm Beispiel: Speicherdiagramm Nach Ende der Ausführung des Programmes von Folie 3.7 hatten wir in etwa folgendes Speicherdiagramm: Stack matthiasgiro johannasspar zinssatz 1.25 Heap Bankkonto kontostand 2025.0 besitzer String Bankkonto kontostand 20000.0 besitzer data Matthias String data Johanna Verweise wurden durch einfach Pfeile dargestellt. Alle lokalen Variablen des Stacks dargestellt. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.7

UML Objektdiagramme Klassendiagramm Beispiel: Objektdiagramm Der gleiche Programmzustand nun als UML-Objektdiagramm: johannasspar : Bankkonto Kontostand = 2025.0 matthiasspar : Bankkonto Kontostand = 20000.0 besitzer : String data = Johanna besitzer : String data = Matthias Es werden nur noch Objekte abgebildet. Die Stack-Variable zinssatz fehlt in dieser Darstellung. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.8

UML Objektdiagramme Klassendiagramm Beispiel: Objektdiagramm Der gleiche Programmzustand nun als UML-Objektdiagramm: johannasspar : Bankkonto Kontostand = 2025.0 matthiasspar : Bankkonto Kontostand = 20000.0 besitzer : String data = Johanna besitzer : String data = Matthias Strings werden aber meist nicht als eigene Objekte dargestellt: johannasspar : Bankkonto Kontostand = 2025.0 Besitzer = Johanna matthiasspar : Bankkonto Kontostand = 20000.0 Besitzer = Matthias Es werden nur noch Objekte abgebildet. Die Stack-Variable zinssatz fehlt in dieser Darstellung. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.8

UML Objektdiagramme Klassendiagramm Klassendiagramme Klassen werden in UML als dreigeteilte Rechtecke dargestellt: 1 Klassenname (unterstrichen oder fett gedruckt) 2 Instanzvariablen 3 Methoden (meist nur public) Instanzvariablen und Methoden werden manchmal mit ihrer Sichtbarkeit gekennzeichnet: + public private package private # protected (nur für Erben sichtbar) Ob man private Instanzvariablen und/oder Methoden angibt, hängt vom Anwendungsfall ab. Meist ist es zweckmäßig, alle Instanzvariablen und nur die öffentlichen Methoden anzugeben. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.9

UML Objektdiagramme Klassendiagramm Beziehungen im Klassendiagramm Beziehungen zwischen Klassen werden durch Linien und Pfeile mit verschiedenen Spitzen dargestellt: Implementierung von Klasse zu implementierter Schnittstelle (Interface) Vererbung, ist-ein von Unterklasse zu Oberklasse Verwendung, benutzt zu Klasse, deren Methoden aufgerufen werden Aggregation, im-besitz-von mehrere Besitzer möglich Klasse an Rautenspitze besitzt Instanzvariable davon Komposition, ist-teil-von besitzt exklusive Instanzvariable, d.h. Lebensspanne wird von Element an ausgefüllter Rautenspitze bestimmt Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.10

UML Objektdiagramme Klassendiagramm UML Notationen In UML zeichnet man z.b. von der Klasse zur Schnittstelle einen gestrichelten Pfeil mit dreieckiger, hohler Spitze: Da es im Diagramm nicht immer so einen Pfeil geben muss, wird die Schnittstelle selbst vor dem Namen auch noch mit dem Schlüsselwort <<interface>> gekennzeichnet. Bemerkung: UML ist nicht speziell für Java erdacht worden, sondern soll allgemein für alle Programmiersprachen verwendet werden. Entsprechend kann die Auslegung der UML Spezifikation je nach verwendeter Sprache etwas variieren. Für Interfaces in Java ist z.b. auch noch die alternative Ball -Notation gebräuchlich: Neben die Klasse zeichnet man eine Linie, welche in einem Kreis endet, unter dem einfach nur der Name des Interface steht. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.11

UML Objektdiagramme Klassendiagramm Beispiel: UML Klassendiagramm I Ein Pfeil mit hohler Dreieckspitze von Unterklasse zu Oberklasse zeigt Vererbung im UML-Klassendiagramm an: Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.12

UML Objektdiagramme Klassendiagramm Beispiel: UML Klassendiagramm II Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.13

UML Objektdiagramme Klassendiagramm Aggregation vs Komposition Der Unterschied zwischen Aggregation und Komposition liegt darin, ob der Teil unabhängig vom Besitzer der Instanz existieren kann: Quelle: Wikimedia, gemeinfrei Kein Raum kann ohne Gebäude existieren, d.h. jeder Raum wird von einem Gebäude-Objekt als Attribut besessen, damit ist die Lebensspanne beider Objekte gleich. Dagegen kann ein Student meist auch ohne Vorlesung gut leben; ein Student-Objekt wird also noch woanders verwendet. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.14

UML Objektdiagramme Klassendiagramm Aggregation vs Komposition Der Unterschied zwischen Aggregation und Komposition liegt darin, ob der Teil unabhängig vom Besitzer der Instanz existieren kann: Quelle: Wikimedia, gemeinfrei Am Pfeil kennzeichnet man oft noch die Multiplizität: Ein Gebäude hat mindestens einen Raum; jeder Raum hat genau ein Gebäude. Eine Vorlesung muss mindestens 3 Studenten haben; ein Student kann beliebig viele Vorlesungen hören, muss aber nicht. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.14

UML Objektdiagramme Klassendiagramm Zusammenfassung UML UML Diagramme dienen der grafischen Veranschaulichung während des Softwareentwicklungsprozesses. UML-Klassendiagramme veranschaulichen Klassen und ihre Beziehungen/Abhängigkeiten untereinander. UML-Objektdiagramme veranschaulichen einen ausgewählten Teil des Zustands des Speichers zu einem speziellen Zeitpunkt während des Programmablaufs. UML Diagramme sollten sich immer nur auf eine Auswahl bzw. auf einen Teilaspekt des Projektes beschränken. Ein Diagramm des gesamten Projektes ist selten hilfreich. Martin Hofmann, Steffen Jost Einführung in die Programmierung UML 9.15

Einführung in die Programmierung mit Java Teil 10: Ausnahmebehandlung Martin Hofmann Steffen Jost LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 7. Dezember 2017 Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.1

Teil 10: Ausnahmebehandlung 2 Ausnahmen und Fehler Grundlagen Fehler und Ausnahmen Syntax von Ausnahmen Selbstdefinierte Ausnahmen Abfangen von Ausnahmen Geprüfte Ausnahmen Praxis 3 Das Entwurfsmuster Singleton 4 Zusammenfassung Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.2

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Fehlerhafte Software Software kann aus vielen Gründen unerwünschtes Verhalten zeigen: Fehler beim Entwurf, d.h. bei der Modellierung des Problems Fehler bei der Programmierung des Entwurfs Programm bricht mit NullPointerException ab Algorithmen falsch implementiert... Ungenügender Umgang mit außergewöhnlichen Situationen fehlerhafte Benutzereingaben, z.b. Datum 31.11.2017 Abbruch der Netzwerkverbindung Dateien können nicht gefunden werden... Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.3

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Fehler vs Ausnahme Ausnahmesituationen unterscheiden sich von Programmierfehlern darin, dass man sie nicht (zumindest prinzipiell) von vornherein ausschließen kann. Immer möglich sind zum Beispiel: unerwartete oder ungültige Benutzereingaben Ein- und Ausgabe-Fehler beim Zugriff auf Dateien oder Netzwerk... Programmierfehler, welche nicht auftreten sollten, z.b.: Quadratwurzel einer negativen Zahl bestimmen Division durch 0 Methodenaufruf mit einem Null-Pointer... Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.4

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Beispiel public static int fakt(int x) { if (x < 0) { throw new IllegalArgumentException ("fakt: Negatives Argument " + x); else {... Die Ausführung von System.out.println(fakt(-2)) führt zu Exception in thread "main" \ java.lang.illegalargumentexception: \ fakt: Negatives Argument -2 at Fakt.fakt(Fakt.java:7) at Fakt.main(Fakt.java:3) Process Fakt exited abnormally with code 1 Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.5

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Was passiert hier? Werfen einer Ausnahme mit dem Statement throw exp ; wobei exp ein Ausdruck des Typs Throwable ist. Im Beispiel new IllegalArgumentException("... ") Das Werfen der Ausnahme bricht die Programmabarbeitung sofort ab. Es kommt zu einer Fehlermeldung aus der die Art der geworfenen Ausnahme, ihr String-Parameter, sowie der Ort (Klasse, Methode, Programmzeile) ihres Auftretens hervorgeht. IllegalArgumentException ist eine Klasse, welche einen Konstruktor besitzt, der einen String als Argument erwartet. Davon wird mit new wie gewohnt ein Objekt erzeugt. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.6

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Vordefinierte Ausnahmen Alle Ausnahmen gehören zur (vordefinierten) Klasse Exception oder einer Unterklasse. Exception selbst ist Unterklasse von Throwable. Das Argument der throw-anweisung muss Throwable sein. Unterklassen von Exception sind IOException, ClassNotFoundException, CloneNotSupportedException, RuntimeException, u.v.a.m. Unterklassen von IOException sind EOFException und FileNotFoundException u.v.a.m. Unterklassen von RuntimeException sind IllegalArgumentException, IndexOutOfBoundsException u.v.a.m. Unterklasse von IllegalArgumentException ist z.b.: NumberFormatException Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.7

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Deklaration eigener Ausnahmen public static int fakt(int x) { if (x < 0) { throw new FakultaetAusnahme ("fakt: Negatives Argument " + x); else {... public class FakultaetAusnahme extends Exception { public FakultaetAusnahme() { public FakultaetAusnahme(String grund) { super(grund); Ausnahmen sind normale Objekte von gewöhnlich deklarierten Klassen, welche Erben von Exception sind. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.8

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Deklaration eigener Ausnahmen... double foo =...; throw new MeineAusname(42, "Grund", foo);... public class MeineAusnahme extends Exception { private int ifehler; private double dfehler; public FakultaetAusnahme(int i, String grund, double d) { super(grund); this.ifehler = i; this.dfehler = d; public int getifehler() { return this.ifehler; public double getdfehler() { return this.dfehler; Ausnahme-Objekte können zusätzliche Informationen speichern, die beim Auffangen des Fehlers ausgewertet werden kann. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.9

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Abfangen von Ausnahmen Mit try catch werden Ausnahmen abgefangen. public static void main(string[] args) { Scanner konsole = new Scanner(System.in); try { System.out.println("Bitte die Zahl"); String input = konsole.nextline(); int zahl = Integer.parseInt(input); System.out.println("Fakt("+zahl+")="+fakt(zahl)); catch (NumberFormatException ausnahme) { System.out.println("Falsche Eingabe."); catch (IllegalArgumentException e) { System.out.print(e.getMessage()); Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.10

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Subtyping beachten! Ausnahmen in sinnvolle statement ::= try Hierarchie gliedern! try ::= try {( statement ) + ( catch-clause ) [finally { statement ] catch-clause ::= catch ( exception-class variable ) { statement Abfangen von Ausnahmen Wird im try Block eine Ausnahme geworfen, so werden der Reihe nach alle catch Blöcke (handler) durchgegangen. Der erster Handler, dessen Klasse zur Ausnahme passt, kommt zur Anwendung. Das Ausnahmeobjekt wird an den Parameter gebunden und der entsprechende Code wird ausgeführt. Dabei kann erneut eine Ausnahme geworfen werden. Man sollte darauf achten, dass Handler die Ausnahmen sinnvoll bearbeiten! NIE sinnvoll: catch (Exception e) { Jede Ausnahme versteht die Methode printstacktrace(). Dies gibt die Folge der Methodenaufrufe bis zu ihrer Auslösung auf der Konsole aus. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.11

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Subtyping beachten! Ausnahmen in sinnvolle statement ::= try Hierarchie gliedern! try ::= try {( statement ) + ( catch-clause ) [finally { statement ] catch-clause ::= catch ( exception-class variable ) { statement Abfangen von Ausnahmen Wird im try Block eine Ausnahme geworfen, so werden der Reihe nach alle catch Blöcke (handler) durchgegangen. Der erster Handler, dessen Klasse zur Ausnahme passt, kommt zur Anwendung. Das Ausnahmeobjekt wird an den Parameter gebunden und der entsprechende Code wird ausgeführt. Dabei kann erneut eine Ausnahme geworfen werden. Man sollte darauf achten, dass Handler die Ausnahmen sinnvoll bearbeiten! NIE sinnvoll: catch (Throwable t) { Jede Ausnahme versteht die Methode printstacktrace(). Dies gibt die Folge der Methodenaufrufe bis zu ihrer Auslösung auf der Konsole aus. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.11

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Subtyping beachten! Ausnahmen in sinnvolle statement ::= try Hierarchie gliedern! try ::= try {( statement ) + ( catch-clause ) [finally { statement ] catch-clause ::= catch ( exception-class variable ) { statement Abfangen von Ausnahmen Wird im try Block eine Ausnahme geworfen, so werden der Reihe nach alle catch Blöcke (handler) durchgegangen. Der erster Handler, dessen Klasse zur Ausnahme passt, kommt zur Anwendung. Das Ausnahmeobjekt wird an den Parameter gebunden und der entsprechende Code wird ausgeführt. Dabei kann erneut eine Ausnahme geworfen werden. Man sollte darauf achten, dass Handler die Ausnahmen sinnvoll bearbeiten! NIE sinnvoll: catch (Exception e) { Jede Ausnahme versteht die Methode printstacktrace(). Dies gibt die Folge der Methodenaufrufe bis zu ihrer Auslösung auf der Konsole aus. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.11

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Zusatzinformationen auswerten Damit wird klar, wie Zusatzinformationen genutzt werden können: try {... if (...) { throw new MeineAusname(xyz, "Grund", foo);... catch (MeineAusnahme ma) { System.out.println("Fehlercode " + ma.getifehler); System.out.println(ma.getMessage + ma.getdfehler); public class MeineAusnahme extends Exception { private int ifehler; private double dfehler; public FakultaetAusnahme(int i, String grund, double d) { super(grund); this.ifehler = i; this.dfehler = d; public int getifehler() { return this.ifehler; public double getdfehler() { return this.dfehler; Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.12

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Die finally-klausel Es kann passieren, dass bestimmte Anweisungen auf jeden Fall durchgeführt werden müssen, auch wenn eine Ausnahme geworfen wird. Netzwerkverbindung schließen, Dateien speichern, etc. Dafür gibt es das finally-konstrukt: Es wird immer ausgeführt, egal ob vorher ein passender Handler ausgeführt wurde oder nicht. Beispiel: try { /* Alle Kombinationen der Reihe nach durchprobieren. */ finally { /* Abhauen */ Im [Horstmann] stehen geringfügig sinnvollere Beispiele. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.13

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Fangen und Kontrollfluss Die wesentliche Idee hinter Ausnahmen ist die Möglichkeit, eine Ausnahme an einer anderen Stelle im Programm zu behandeln: Beispiel: Die View eines Spiels muss vom Spieler einen Spielzug erfragen. Die View weiß aber nicht, ob der Zug gültig ist. Das Modell setzt den Spielzug um und merkt dabei, dass der Zug ungültig ist. Es wirft eine spezielle Ausnahme. Der Controller fängt die Ausnahme und entscheidet, ob die Spieler neu befragt werden, oder ob ein Standardzug gespielt wird. Fazit: Ohne Ausnahmen müsste das Modell hier immer einen Wert zurückgeben, ob alle Spielzüge gültig waren und wenn nein, welche Probleme aufgetreten sind. Ausnahmen kann man also als zusätzliche Rückgabewerte auffassen, welche implizit nach Oben durchgereicht werden. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.14

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Fangen und Kontrollfluss Die wesentliche Idee hinter Ausnahmen ist die Möglichkeit, eine Ausnahme an einer anderen Stelle im Programm zu behandeln: Beispiel: DieDieses View Beispiel eines Spiels soll muss nicht vom sagen, Spieler dass man einenesspielzug so machen erfragen. muss! DieWenn Viewdie weiß Funktion aber nicht, des Modells, ob der Zug welche gültigder ist. Controller aufruft, Das ohnehin Modellnur setzt den den Rückgabetyp Spielzug umvoid und hat, merkt dann dabei, kann dass man der auch Zug ungültig einfachist. diesen Es wirft Rückgabetyp eine spezielle ändern Ausnahme. und nutzen, anstatt eine Ausnahme zu werfen! Der Controller fängt die Ausnahme und entscheidet, ob die Spieler neuausnahmen befragt werden, sind eine oderbequeme ob ein Standardzug Lösung, wenn gespielt manwird. mehr als einen Rückgabetyp benötigt. Der Einsatz von Ausnahmen lässt Fazit: sich immer Ohne Ausnahmen vermeiden! müsste das Modell hier immer einen Wert zurückgeben, ob alle Spielzüge gültig waren und wenn nein, welche Probleme aufgetreten sind. Ausnahmen kann man also als zusätzliche Rückgabewerte auffassen, welche implizit nach Oben durchgereicht werden. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.14

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Fehler und Ausnahmen in Java In Java werden verschiedene Arten von Ausnahmen und Fehlern durch verschiedene Unterklassen von Throwable repräsentiert: Instanzen von Error Unbehandelbare, unerwartete Fehler, z.b. Fehler der virtuellen Maschine Instanzen von Exception Vorhersehbare Ausnahmen, welche vom Programmierer zu behandeln sind Instanzen von RuntimeException Häufige Ausnahmen, die nicht behandelt werden müssen. Alle Unterklassen von Exception, welche nicht auch Unterklassen von RuntimeException sind, werden als geprüfte Ausnahmen (engl. checked exception) bezeichnet. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.15

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Geprüfte Ausnahmen Überprüfte Ausnahmen (checked exceptions) müssen entweder aufgefangen werden oder explizit als möglich deklariert werden: import java.io.*;... public void m() { throw new IOException(""); Kompilieren führt zu folgender Fehlermeldung: /home/mhofmann/work/teaching/eip/fakt.java:19:\ unreported exception java.io.ioexception; must \ be caught or declared to be thrown throw new IOException(""); ^ Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.16

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Deklaration überprüfter Ausnahmen Kann in einer Methode eine überprüfte Ausnahme auftreten und wird sie nicht aufgefangen, so muss sie mit throws in der Signatur deklariert werden: import java.io.*;... public void m() throws IOException{ throw new IOException(""); Eine Methode muss eine geprüfte Ausnahme auch dann deklarieren, wenn Sie diese nicht selbst wirft, sondern lediglich eine andere Methode aufruft, welche eine geprüfte Ausnahme werfen könnte. Der Compiler überprüft für uns, dass jede geprüfte Ausnahme irgendwo gefangen wird oder in der Signatur der main-methode als möglich deklariert wurde. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.17

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Unchecked Exceptions Ausnahmen, deren Auftreten von Zeit zu Zeit unvermeidlich ist und daher vom Programmierer erwartet werden sollen (z.b. FileNotFoundException) werden überprüft. Ausnahmen, deren Auftreten auf einen Programmierfehler hindeutet, werden nicht überprüft: unchecked exceptions. (Unterklassen von RuntimeException und Error). Prominentes Beispiel ist die NullPointerException: Auftreten ist in Java praktisch überall möglich. Es macht aber wenig Sinn, dies in jeder Methodensignatur hinzuschreiben. Stattdessen ist es Aufgabe des Programmierteams, durch geeignete Klasseninvarianten oder Laufzeitprüfungen (if (a==null)... ) sicherzustellen, dass diese nicht auftreten können. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.18

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Ausnahmen nicht missbrauchen Ausnahmen sind ein relativ teurer Mechanismus, welcher nur in Ausnahmesituationen verwendet werden sollte. So bitte nicht: try { while (true) {... if (something) { throw EndLoop(); catch (EndLoop el) { Besser: do {... while (!something); Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.19

Ausnahmen Grundlagen Syntax Eigene Ausnahmen Fangen Geprüfte Praxis Mögliche Ausnahmen dokumentieren Auch wenn ungeprüfte Ausnahmen nicht mit throws deklariert werden müssen, ist es gute Stil, mögliche ungeprüfte Ausnahmen im Javadoc zu dokumentieren. Beispiel: Im Javadoc der Methode get von ArrayList wird klar angegeben, dass die ungeprüfte Ausnahme IndexOutOfBoundsException geworfen wird, wenn auf einen nicht vorhandenen Index des Arrays zugegriffen wird. /** * Returns the element at the specified position in this list. * * @param index index of the element to return * @return the element at the specified position in this list * @throws IndexOutOfBoundsException {@inheritdoc */ public E get(int index) {... (aus dem Quelltext von java.util.arraylist) Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.20

Singleton-Pattern Das Singleton Pattern Manchmal möchte man von einer Klasse nur eine einzige, eindeutige Instanz erzeugen. Es soll nicht möglich sein, mehr als ein Objekt diese Klasse zu erzeugen. Beispiel Ausnahmen bei der Chipkartenprogrammierung. Chipkarten (JavaCard) haben keine Garbage Collection; man muss daher vermeiden, zuviele (Ausnahme-)Objekte zu erzeugen. Idee Klassenvariable speichert das Objekt. Ist die Referenz in der Klassenvariable null, dann wird das Objekt einmal erzeugt. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.21

Singleton-Pattern Durchführung class Fehler extends Exception { private static Fehler instanz = null; private String extragrund; private Fehler() { // Konstruktor ist privat!!! public String getgrund() { return extragrund; private void setgrund(string s) { this.extragrund = s; public static Fehler getinstanz(string s) { if (instanz == null) instanz = new Fehler(); instanz.setgrund(s); return instanz; Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.22

Singleton-Pattern Durchführung class Fehler extends Exception { private static Fehler instanz = null; private String extragrund; private Throwable Fehler() vererbt{ bereits ein// String-Attribut, Konstruktor ist privat!!! welches mit getmessage ausgelesen werden kann. public String getgrund() { extragrund ist hier nur zu Demonstrationszwecken eingeführt, wie ein Zustand gespeichert wer- return extragrund; private den kann. void setgrund(string s) { this.extragrund = s; public static Fehler getinstanz(string s) { if (instanz == null) instanz = new Fehler(); instanz.setgrund(s); return instanz; Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.22

Singleton-Pattern Durchführung import javax.swing.*; public class Anwendung { public static void main(string[] args) { try { String input = JOptionPane.showInputDialog ("Bitte die Zahl:"); int n = Integer.parseInt(input); if (n < 0) throw Fehler.getInstanz("Negative Zahl " + n); System.out.println(n); System.exit(0); catch (Fehler f) { System.out.println(f.getGrund());main(args); Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.23

Zusammenfassung Zusammenfassung Mit throw werden Ausnahmen geworfen. Eine nicht aufgefangene Ausnahme führt zum Programmabbruch. Ausnahmen sind Objekte von Unterklassen von Exception. Mit catch werden Ausnahmen abgefangen. Ein finally Block wird immer ausgeführt, auch wenn der vorangegangene try-block eine Ausnahme wirft. Es gibt vordefinierte Ausnahmen und selbstdefinierte. Es gibt geprüfte und ungeprüfte Ausnahmen. Ausnahmen sinnvoll behandeln, niemals einfach ignorieren. Ausnahmen können als zusätzliche Rückgabewerte aufgefasst werden. Das Singleton Entwurfsmuster besteht darin, von einer Klasse nur einmal eine Instanz zu erzeugen. Martin Hofmann, Steffen Jost Einführung in die Programmierung Ausnahmebehandlung 10.24