FH D Fachhochschule Düsseldorf University of Applied Sciences 12 Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.‐ Ing. André Stuhlsatz FH D Wiederholung: Exceptions in Java Fachhochschule Düsseldorf University of Applied Sciences Ausnahmen (Exceptions) sind Instanzen einer speziellen Klassehierarchie der Standardbibliothek: Throwable Exception IO Runtime Exception Exception Error Zum Auslösen oder „Werfen“ von Exceptions dient die Anweisung throw: class Fehler{ public static void main(String[] args){ throw new RuntimeException(); } } Informatik 2 FH D 2 Wiederholung: Exceptions Fachhochschule Düsseldorf University of Applied Sciences Alle Methoden in Java die eine Exception auslösen können, müssen dies mittels throws anzeigen (Checked Exceptions): class Fehler{ public static void main(String[] args) throws Exception{ throw new Exception(); } } Des Weiteren muss mit catch sichergestellt werden, dass eine Exception auch „gefangen“ wird: Versuch (try) eine try{ Anweisung //Anweisungen auszuführen, die } catch(Typ Objekt){ eine Ausnahme //Anweisungen erzeugen könnte. } Ausnahme bilden hierbei Error, RuntimeException und deren Subklassen (Unchecked Exceptions). Informatik 2 3 1 FH D Wiederholung: try/catch‐Block Fachhochschule Düsseldorf University of Applied Sciences Mit Hilfe des catch‐Blocks fängt man eine oder mehrere Ausnahmen vom entsprechenden Ausnahmetyp: try{ //Anweisungen } catch(Typ1 Objekt){ //Anweisungen } catch(Typ2 Objekt){ //Anweisungen } finally{ //Anweisungen } Jeder Exception‐Typ darf in einem try‐catch‐Block nur einmal abgefragt werden! Optional darf nach einem catch‐Block noch ein finally‐Block stehen. Der finally‐Block wird quasi immer ausgeführt. 4 Informatik 2 FH D Wiederholung: Benutzerdefinierte Exceptions Fachhochschule Düsseldorf University of Applied Sciences Eigene Ausnahmen werden durch Ableiten von der throwable‐Klasse bzw. ihrere Subklassen (in der Regel von der Klasse Exception) ermöglicht: class DivisionDurchNull extends Exception{ public DivisionDurchNull(){ super("Division durch Null"); } } Generell hat man die Möglichkeit durch catch(Throwable e) auf alle erdenklichen Exceptions zu reagieren. Man sollte im Allgemeinen auf einzelne Exception über einen entsprechenden catch‐Block reagieren. Dabei gilt, dass man sich vom Speziellen (Subklasse) zum Allgemeinen (Superklasse) in der Exception‐Hierarchie „durchhangelt“. 5 Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences Innere Klassen/Interfaces Klassen (oder) Interfaces können zur besseren Strukturierung ineinander verschachtelt werden. Eine Definition von inneren Klassen/Interfaces (inner class/inner interface) erfolgt innerhalb einer anderen Klasse/Interface (outer class/outer interface). Bisherige Klassen werden „Top‐Level‐Klasssen“ genannt. class TopLevelClass{ … } class OuterClass{ class InnerClass{ … } … } Motivation von inneren Klassen/Interfaces ist die Bereitstellung von Hilfsklassen/‐interfaces möglichst nahe und gekapselt, wo sie benötigt werden. Innere Klassen/Interfaces können auf Eigenschaften der äußeren Klasse zugreifen (auch auf private!). Informatik 2 6 2 FH D Typen von inneren Klassen in Java Fachhochschule Düsseldorf University of Applied Sciences Es gibt vier Arten von inneren Klassen in Java: Geschachtelte Klassen sind Top‐Level‐Klassen, obwohl sie innerhalb einer anderen Klasse definiert sind. Elementklassen sind ganz allgemein innere Klassen. Lokale Klassen werden innerhalb einer Methode oder eines Blockes definiert. Anonyme Klasse sind lokal und namenlos. Informatik 2 FH D 7 Geschachtelte Klassen Fachhochschule Düsseldorf University of Applied Sciences Geschachtelte Top‐Level‐Klassen sind mit static deklarierte innere Klassen: class OuterClass{ static int i; int j; public static class StaticInnerClass{ public void setzeI(){ i = 20; Zugriff ist nur auf { statische Elemente } der äußeren Klasse … möglich! } Objekte von geschachtelten Klassen können auch ohne ein Objekt der äußeren Klasse existieren: OuterClass a = new OuterClass(); OuterClass.StaticInnerClass ab = new OuterClass.StaticInnerClass(); Geschachtelte Top‐Level‐Klassen dienen nur der Strukturierung (Namensraumerweiterung). Informatik 2 FH D 8 Elementklassen Fachhochschule Düsseldorf University of Applied Sciences Element Klassen sind echte innere Klassen und dienen nicht nur der Strukturierung. Elementklassen haben auf alle Elemente der äußeren Klasse Zugriff, auch auf private. Elementklassen werden analog Top‐Level‐Klassen gebildet und verwendet, sie dürfen aber keine statischen Elemente enthalten. Objekte von Elementklassen sind immer mit Objekten der äußeren Klasse verbunden: class A{ } private int i; public class B{ public class C{ public C(){i = 5}; } Objekterzeugung: public void init(){ A a = new A(); i = 0; j = 0; A.B b = a.new B(); { } A.B.C c = b.new C(); Informatik 2 3 FH D Lokale Klassen Fachhochschule Düsseldorf University of Applied Sciences Lokale Klassen sind nicht auf oberster Ebene zugreifbar, sondern nur in Methoden oder Blöcken in denen sie definiert sind: class A{ … public void doSomething(){ int i = 0; class Worker implements Runnable{ public void run{…}; } new Worker().run(); … } … } Lokale Klassen dürfen daher nicht als private,public protected oder static deklariert werden! Informatik 2 FH D 10 Lokale Klassen Fachhochschule Düsseldorf University of Applied Sciences Lokale Klassen dürfen keine statischen Elemente haben. Lokale Klassen dürfen nicht den gleichen Namen tragen wie eine umgebene Klasse. Eine lokale Klasse kann nur auf Konstanten (final) des umgeben Codeblocks zugreifen: class A{ int j = 0;// Zugriff möglich public void doSomething(){ int i = 0;// kein Zugriff möglich final k = 0;// Zugriff möglich, weil final class Worker implements Runnable{ int n=0; public void run{ n = (k++) * (j++); }; } new Worker().run(); … } … } Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 11 Anonyme Klassen Anonyme Klassen kann man als lokale „wegwerf“‐Klassen bezeichnen. Sie werden wie lokale Klassen in Methoden bzw. Anweisungsblöcken definiert. Sie haben die gleichen Einschränkungen wie lokale Klassen. Sie besitzen keinen Namen und auch keinen Konstruktor. Anonyme Klassen können nicht mit den Schlüsselwörten extends und implements verwendet werden. Bei Definition entsteht immer gleich das Objekt: class A{ public void doSomething(){ Runnable Worker = new Runnable(){ public void run{ // mach was… }; } Worker.run(); … } … } Informatik 2 12 4