n 1. Unterklassen und Vererbung n 2. Abstrakte Klassen und Interfaces n 3. Modularität und Pakete n 4. Ausnahmen (Exceptions) n 5. Generische Datentypen n 6. Collections II.4.4 Exceptions - 1 -
Ausnahmen (Exceptions) Treten auf, wenn zur Laufzeit semantische Restriktionen nicht erfüllt werden, z.b. n Arithmetische Ausnahmen: z.b. Division durch 0, Wurzel aus negativer Zahl, Overflow n Unzulässiger Zugriff auf Datenstrukturen: z.b. Zugriff auf Array-Element mit negativem Index oder Index größer als length()-1. z.b. Zugriff auf Eigenschaften eines Objekts über einen Verweis, der null ist n Infrastrukturelle Ausnahmen: z.b. Lesen aus einer Datei, die nicht existiert z.b. Fehlschlag bei expliziter Datentypkonvertierung von Ober- zu Unterklasse II.4.4 Exceptions - 2 -
Exception Handling n Wenn in einem Programmblock Ausnahmen auftreten, wird ein Exception Handler aufgerufen try {... Normalblock... catch (AusnahmeArt1 Parameter1) {.. Exception Handler1.. catch (AusnahmeArt2 Parameter2) {.. Exception Handler2..... finally {.. Abschließende Anweisungen.. n Bei Auftreten einer Ausnahme im Normalblock wird zu dem entsprechenden Exception Handler gesprungen. n Der finally Block ist optional und wird auf jeden Fall am Ende ausgeführt. II.4.4 Exceptions - 3 -
Exception Objekte Eine Ausnahme ist ein Objekt der Klasse Throwable: Throwable Error Exception... RuntimeException n Ausnahmeobjekte werden implizit erzeugt, wenn eine Ausnahme auftritt. n Throwable hat den Konstruktor Throwable(String m) und die Methoden getmessage(), printstacktrace(), tostring(), etc. n Error und RuntimeException: unchecked exceptions, müssen nicht gefangen werden II.4.4 Exceptions - 4 -
Beispiele von Exception Klassen n IOException und IOError Fehler in Ein- oder Ausgabe n ArithmeticException z.b. x/0 für int x n ArrayIndexOutOfBoundsException Überschreiten des Indexbereichs eines Arrays n ClassCastException Fehlschlag bei expliziter Konversion von Ober- zu Unterklasse n NumberFormatException Versuch, String, der keine gültige Zahl enthält, in Zahl umzuwandeln n NullPointerException Versuch, auf Objektvariable über null-verweis zuzugreifen II.4.4 Exceptions - 5 -
Wo werden Exceptions behandelt public int M1() {.. M2();.... public int M2() { try {.. M3();.. catch (A a) {.. public int M3() {.. M4();.. public int M4() { try {.. // Hier wird eine Exception vom Typ A erzeugt... catch (B b) {.. Aufruf von M4 führt zu Exception A. Diese wird im Aufruf von M2 abgehandelt. II.4.4 Exceptions - 6 -
Wo werden Exceptions behandelt public int M1() {.. M2();.. // Hier wird eine Exception vom Typ B erzeugt... public int M2() { try {.. M3();.. catch (A a) {.. public int M3() {.. M4();.. public int M4() { try {.. // Hier wird eine Exception vom Typ A erzeugt... catch (B b) {.. Aufruf von M4 führt zu Exception A. Diese wird im Aufruf von M2 abgehandelt. Exception B im Aufruf von M1 wird vom Laufzeitsystem abgehandelt. II.4.4 Exceptions - 7 -
public class NegativeNumberException extends Exception { private int value; public NegativeNumberException(int value) {this.value = value; public int getvalue() {return value; public class TooBigNumberException extends Exception { private int value;... public static int fak (int x) throws NegativeNumberException{ Benutzerdefinierte Exceptions if (x < 0) throw new NegativeNumberException(x); if (x > 16) throw new TooBigNumberException(x); if (x > 1) return x * fak (x - 1); else return 1; try{system.out.println ("Fakultaet von " + x + " ist " + fak(x)); catch (NegativeNumberException nne) {System.out.println ("Fehler! " + nne.getvalue() + " < 0."); catch (Exception e) {System.out.println ("Fehler! Es trat die folgende Ausnahme auf: " + e ); II.4.4 Exceptions - 8 -
Benutzerdefinierte Exceptions public class NegativeNumberException extends Exception { private int value; public NegativeNumberException(int value) {this.value = value; public int getvalue() {return value; public class TooBigNumberException extends Exception { private int value;... public static int fak (int x) throws NegativeNumberException,TooBigNumberException{ if (x < 0) throw new NegativeNumberException(x); if (x > 16) throw new TooBigNumberException(x); if (x > 1) return x * fak (x - 1); else return 1; try{system.out.println ("Fakultaet von " + x + " ist " + fak(x)); catch (NegativeNumberException nne) {System.out.println ("Fehler! " + nne.getvalue() + " < 0."); catch (Exception e) {System.out.println ("Fehler! Es trat die folgende Ausnahme auf: " + e ); II.4.4 Exceptions - 9 -
Benutzerdefinierte Exceptions public class NegativeNumberException extends Exception {... public class TooBigNumberException extends Exception {... public static void test() throws Exception { int x = Integer.parseInt(System.console().readLine()); try{system.out.println ("Fakultaet von " + x + " ist " + fak(x)); catch (NegativeNumberException nne) {System.out.println("Fehler! " + nne.getvalue() + " < 0."); finally {System.out.println ("Ende des try-catch-blocks"); System.out.println ("Ende der Methode test."); public static int fak (int x) throws NegativeNumberException,TooBigNumberException{ if (x < 0) throw new NegativeNumberException(x); if (x > 16) throw new TooBigNumberException(x); if (x > 1) return x * fak (x - 1); else return 1; try{test(); catch (Exception e) {System.out.println ("Fehler! Es trat die folgende Ausnahme auf: " + e ); II.4.4 Exceptions - 10 -
n 1. Unterklassen und Vererbung n 2. Abstrakte Klassen und Interfaces n 3. Modularität und Pakete n 4. Ausnahmen (Exceptions) n 5. Generische Datentypen n 6. Collections II.4.5 Generische Datentypen - 11 -
Ähnliche Programmteile public class Bruchelement { Bruch wert; Bruchelement next;... public class Wortelement { Wort wert; Wortelement next;... public class Bruchliste { Bruchelement kopf; public class Wortliste { Wortelement kopf; Liste () { kopf = null; void fuegevorneein (Bruch wert) {... Liste () { kopf = null; void fuegevorneein (Wort wert) {... Bruchelement suche (Bruch wert) {... Wortelement suche (Wort wert) {... II.4.5 Generische Datentypen - 12 -
Allgemeine Liste public class Bruchelement { Bruch wert; Bruchelement next;... public class Element { Object wert; Element next;... public class Bruchliste { Bruchelement kopf; public class Liste { Element kopf; Liste () { kopf = null; void fuegevorneein (Bruch wert) {... Liste () { kopf = null; void fuegevorneein (Object wert) {... Bruchelement suche (Bruch wert) {... Element suche (Object wert) {... II.4.5 Generische Datentypen - 13 -
Verwendung der allgemeinen Liste Bruch b1 = new Bruch (1,2), b2 = new Bruch (5,4); Element e; public class Element { Object wert; Element next;... Liste l = new Liste (); l.fuegevorneein (b1); l.fuegevorneein (b2); e = l.suche (b1); l.fuegevorneein ("hallo"); public class Liste { Element kopf; Liste () { kopf = null; void fuegevorneein (Object wert) {... e = l.suche ("hallo"); Element suche (Object wert) {... Listen mit beliebigen Objekten durcheinander II.4.5 Generische Datentypen - 14 -
Generische Liste public class Element <T> { T wert; Element <T> next;... public class Element { Object wert; Element next;... public class Liste <T> { Element <T> kopf; public class Liste { Element kopf; Liste () { kopf = null; void fuegevorneein (T wert) {... Liste () { kopf = null; void fuegevorneein (Object wert) {... Element <T> suche (T wert) {... Element suche (Object wert) {... II.4.5 Generische Datentypen - 15 -
Generische Liste public class Element <T> { T wert; Element <T> next;... Bruch b1 = new Bruch (1,2), b2 = new Bruch (5,4); Element <Bruch> e; public class Liste <T> { Element <T> kopf; Liste () { kopf = null; void fuegevorneein (T wert) {... Liste <Bruch> l = new Liste <Bruch> < > (); l.fuegevorneein (b1); l.fuegevorneein (b2); e = l.suche (b1); l.fuegevorneein ("hallo"); Element <T> suche (T wert) {... e = l.suche ("hallo"); Typfehler (compiliert nicht) II.4.5 Generische Datentypen - 16 -
Generische Klasse public class Element <T> { T wert; Element <T> next;... public class Liste <T> { Element <T> kopf; Eine Klasse, viele Typen: Liste <Bruch>, Liste <Wort>, Generische Typen nur vom Compiler überprüft, nicht zur Laufzeit nicht möglich (statische Methode existiert nur einmal pro Klasse) static Liste () <T> { kopf Element = null; <T> suche (T wert, Element <T> kopf) { if (kopf == null) void fuegevorneein (T wert) {... return null; else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 17 -
Generische Klasse public class Element <T> { T wert; Element <T> next;... public class Liste <T> { Element <T> kopf; Eine Klasse, viele Typen: Liste <Bruch>, Liste <Wort>, Generische Typen nur vom Compiler überprüft, nicht zur Laufzeit erlaubt (generische Methode) static <T> Element <T> suche (T wert, Element <T> kopf) { if void (kopf fuegevorneein == null) (T wert) { return null;... else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 18 -
Generische Klasse public class Element <T> { T wert; Element <T> next;... public class Liste <T> { Element <T> kopf; Eine Klasse, viele Typen: Liste <Bruch>, Liste <Wort>, Generische Typen nur vom Compiler überprüft, nicht zur Laufzeit erlaubt (generische Methode) static <S> Element <S> suche (S wert, Element <S> kopf) { if void (kopf fuegevorneein == null) (T wert) { return null;... else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 19 -
Generische Klasse public class Element <T> { T wert; Element <T> next;... public class Liste <T> { Element <T> kopf; Eine Klasse, viele Typen: Liste <Bruch>, Liste <Wort>, Generische Typen nur vom Compiler überprüft, nicht zur Laufzeit nicht möglich Methode gleich nur in Klassen, die Interface Vergleichbar implementieren static <S> Element <S> suche (S wert, Element <S> kopf) { if void (kopf fuegevorneein == null) (T wert) { return null;... else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 20 -
Typebounds public class Element <T extends Vergleichbar> { T wert; Element <T> next;... public class Liste <T extends Vergleichbar> { Element <T> kopf; static <S> Element <S> suche (S wert, Element <S> kopf) { if void (kopf fuegevorneein == null) (T wert) { return null;... else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 21 -
Typebounds public class Element <T extends Vergleichbar> { T wert; Element <T> next;... public class Liste <T extends Vergleichbar> { Element <T> kopf; static <S extends Vergleichbar> Element <S> suche ( ) { if void (kopf fuegevorneein == null) (T wert) { return null;... else if (wert.gleich(kopf.wert)) return kopf; else return suche (wert, kopf.next); Element <T> suche (T wert) {... II.4.5 Generische Datentypen - 22 -
Ober- und Unterklassen class A implements Vergleichbar {... class B extends A {... class C extends A {... B ist Unterklasse von A C ist Unterklasse von A A [] aarray = new A [5]; B [] barray = new B [17]; aarray = barray; aarray[0] = new C (); Liste <A> alist = new Liste < > (); Liste <B> blist = new Liste < > (); alist = blist; alist.fuegevorneein(new C ()); B[] ist Unterklasse von A[] C[] ist Unterklasse von A[] compiliert, aber Typfehler zur Laufzeit Liste <B> ist keine Unterklasse von Liste <A> Liste <C> ist keine Unterklasse von Liste <A> II.4.5 Generische Datentypen - 23 -
n 1. Unterklassen und Vererbung n 2. Abstrakte Klassen und Interfaces n 3. Modularität und Pakete n 4. Ausnahmen (Exceptions) n 5. Generische Datentypen n 6. Collections II.4.6 Collections - 24 -
Collection Framework Typische Datenstrukturen im Paket java.util vordefiniert Liste <T> n Liste () n String tostring () n void fuegevorneein (T wert) LinkedList <T> n LinkedList () n String tostring () n void addfirst (T wert) Iterable <T> Collection <T> Für Unterklassen von Iterable existiert iterator, der angibt, wie Elemente zu durchlaufen sind Set <T> List <T> LinkedList <T> ArrayList <T> II.4.6 Collections - 25 -
Collection Framework interface Iterable <T> { Iterator <T> iterator(); interface Iterator <T> { boolean hasnext(); T next(); void remove(); Iterable <T> Collection <T> Für Unterklassen von Iterable existiert iterator, der angibt, wie Elemente zu durchlaufen sind Set <T> List <T> LinkedList <T> ArrayList <T> II.4.6 Collections - 26 -
Collection Framework interface Iterable <T> { eins zwei drei Iterator <T> iterator(); interface Iterator <T> { boolean hasnext(); T next(); void remove(); LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { String s = it.next(); System.out.println(s); II.4.6 Collections - 27 -
Collection Framework eins zwei drei interface Iterator <T> { boolean hasnext(); T next(); void remove(); LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { String s = it.next(); System.out.println(s); II.4.6 Collections - 28 -
Collection Framework eins zwei drei interface Iterator <T> { boolean hasnext(); T next(); void remove(); LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { String s = it.next(); System.out.println(s); setzt Iterator weiter und liefert "überlaufenes" Element als Ergebnis II.4.6 Collections - 29 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { String s = it.next(); System.out.println(s); setzt Iterator weiter und liefert "überlaufenes" Element als Ergebnis II.4.6 Collections - 30 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { String s = it.next(); System.out.println(s); setzt Iterator weiter und liefert "überlaufenes" Element als Ergebnis II.4.6 Collections - 31 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); while (it.hasnext()) { for (String s : sl) { String s = it.next(); System.out.println(s); System.out.println(s); II.4.6 Collections - 32 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); it.next(); it.remove(); for (String s : sl) System.out.println(s); II.4.6 Collections - 33 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); it.next(); it.remove(); for (String s : sl) System.out.println(s); II.4.6 Collections - 34 -
Collection Framework eins zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); it.next(); löscht zuletzt "überlaufenes" Element it.remove(); for (String s : sl) System.out.println(s); II.4.6 Collections - 35 -
Collection Framework zwei drei eins zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); it.next(); löscht zuletzt "überlaufenes" Element it.remove(); for (String s : sl) System.out.println(s); II.4.6 Collections - 36 -
Collection Framework zwei drei zwei drei LinkedList <String> sl = new LinkedList < > (); sl.addfirst("drei"); sl.addfirst("zwei"); sl.addfirst("eins"); Iterator <String> it = sl.iterator(); it.next(); löscht zuletzt "überlaufenes" Element it.remove(); for (String s : sl) System.out.println(s);); II.4.6 Collections - 37 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); Autoboxing (konvertiert int in Integer) while (it.hasnext()) { Integer i = it.next(); System.out.println(i); for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 38 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); Autoboxing (konvertiert int in Integer) while (it.hasnext()) { Integer i = it.next(); System.out.println(i); for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 39 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); while (it.hasnext()) { Integer int i = it.next(); System.out.println(i); Autoboxing (konvertiert int in Integer) Unboxing (konvertiert Integer in int) for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 40 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); while (it.hasnext()) { Integer int i = it.next(); System.out.println(i); Autoboxing (konvertiert int in Integer) Unboxing (konvertiert Integer in int) for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 41 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); while (it.hasnext()) { Integer int i = it.next(); System.out.println(i); Autoboxing (konvertiert int in Integer) Unboxing (konvertiert Integer in int) for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 42 -
Collection Framework LinkedList <Integer> il = new LinkedList < > (); il.addfirst(3); il.addfirst(2); il.addfirst(1); Iterator <Integer> it = il.iterator(); while (it.hasnext()) { Integer int i = it.next(); System.out.println(i); Autoboxing (konvertiert int in Integer) Unboxing (konvertiert Integer in int) compiliert, aber Fehler zur Laufzeit for (Integer i : il) System.out.println(i); for (int i : il) { System.out.println(i); il.addfirst(0); II.4.6 Collections - 43 -