Vorlesung Grundlegende Programmiertechniken

Werbung
Vorlesung 10. Sitzung
Grundlegende
Programmiertechniken
Wintersemester 2007/2008
Dozent
Nino Simunic M.A.
Computerlinguistik, Campus DU
Grundlegende
Programmiertechniken, WS 2007/2008
Objektorientierte Ausnahmebehandlung (in Java)
Ausnahmen?
Ausnahmen (engl. Exceptions) sind
Fehlersituationen während der
Programmausführung
Java unterstützt explizite, objektorientierte
Ausnahmebehandlung:
JVM erkennt Ausnahmen und erzeugt entsprechende
Ausnahme-Objekt. Beispiele:
Division durch 0
ArithmeticException
Ungültiger Array-Zugriff (z.B. arr[arr.length])
ArrayIndexOutOfBoundsException
Zugriff aus eine nicht vorhandene Datei
FileNotFoundException
-3-
Ausschnitt der Ausnahme-Klassen-Hierarchie
java.lang.Object
java.lang.Throwable
java.lang.Error
Error: Fehler innerhalb
des Laufzeitsystems.
Können i.d.R. nicht
von behandelt werden.
Beispiele:
VirtualMachineErro
r, ThreadDeath,…
-4-
java.lang.Exception
Exception:»Reguläre«Fehler
»Reguläre«Fehlereines
eines
Exception:
Programm. Teilung
Teilungin
inkontrollierte
kontrollierteund
und
Programm.
unkontrollierteAusnahmen:
Ausnahmen:
unkontrollierte
KontrollierteAusnahmen:
Ausnahmen: Müssen
Müssenvom
vom
Kontrollierte
Programm behandelt
behandeltwerden.
werden.
Programm
UnkontrollierteAusnahmen:
Ausnahmen: Können
Können
Unkontrollierte
vom Programm
Programm behandelt
behandelt werden.
werden.
vom
UnkontrollierteAusnahmen
Ausnahmensind
sind
Unkontrollierte
Subklassenvon
vonRuntimeException
RuntimeException
Subklassen
Bsp. für kontrollierte Ausnahmen: FileNotFoundException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.io.IOException
java.io.FileNotFoundException
FileNotFoundException
FileNotFoundException
Kontrollierte(engl.
(engl. checked)
checked) Ausnahme
Ausnahme––muss
muss
Kontrollierte
behandeltwerden!
werden!
behandelt
-5-
Bsp. für unkontrollierte Ausnahmen:
ArrayIndexOutOfBoundsException
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.io.RuntimeException
java.io.IndexOutOfBoundsException
java.io.ArrayIndexOutOfBoundsException
-6-
ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException
Unkontrollierte(engl.
(engl. unchecked)
unchecked) Ausnahme
Ausnahme––kann
kann
Unkontrollierte
behandeltwerden!
werden!
behandelt
Beispiel für eine Runtime Exception (hier arithmetischer Fehler)
public class Divider {
public static void main(String args[]) {
int a = 10, b = 0, result;
result = a / b;
System.out.println(result);
}
}
ArithmeticException:
ArithmeticException:
Unterklasse
Unterklasse von
von RuntimeException
RuntimeException
Daher:
Daher: unkontrollierte
unkontrollierte Ausnahme.
Ausnahme.
Kann,
Kann, muss
muss aber
aber nicht
nicht behandelt
behandelt werden
werden
-7-
Javas Ausnahmemechanismus (1)
Eine Methode einer Klasse
erkennt eine Ausnahmesituation,
erzeugt ein Objekt einer Ausnahmeklasse
(Objekt enthält Information über den Ausnahme-Typ,
Zustand des Programms, …)
-8-
und löst damit eine Ausnahme aus.
Generell: Ausnahmen sind Ereignisse, welche als
Datenstruktur (Exception-Objekte) repräsentiert
werden.
Informationen eines Ausnahme-Objekts
public class ArrayIndex {
public static void main(String[] args) {
int[] intArr = new int[2];
intArr[0] = 1;
intArr[intArr.length] = 2;
}
}
Typ
Typder
der Ausnahme
Ausnahme
Stack-Trace
Stack-Trace
Umgekehrte
Umgekehrte Auflistung
Auflistung unbeendeter
unbeendeter
Methodenaufrufe
Methodenaufrufe bis
bis zur
zur Ausnahme.
Ausnahme.
-9-
Details
Details
Dokumentation der möglichen Fehlersituationen
-1010-
Standard-Klassen der Java-API dokumentieren
mögliche Exceptions
Javas Ausnahmemechanismus (2)
Die Ausnahme kann
Die Methode, an die die Ausnahme weitergereicht
wurde,
kann diese Ausnahme abfangen und/oder behandeln
oder wiederum weiterzureichen.
Wird die Ausnahme immer nur weitergereicht und
in keiner Methode behandelt, bricht das Programm
mit einer Fehlermeldung ab
-1111-
entweder in derselben Methode abgefangen werden,
oder an die aufrufende Methode weitergegeben werden.
Letzte Möglichkeit zur Behandlung: main()
Details der Klasse Throwable
Konstruktoren von Throwable
Throwable( )
Throwable( String message )
Methoden von Throwable
String getMessage( )
gibt den String aus, der beim Konstruktor übergeben wurde
void printStackTrace( )
Infos zum Laufzeitverhalten beim Auftreten der Ausnahme
-1212-
…
Klasse Exception: Details
Konstruktoren der Klasse Exception
-1313-
Exception()
Exception( String message )
Wird ein Konstruktor aufgerufen, wird ein Objekt
dieser Ausnahmeklasse erstellt, d.h. eine
Ausnahme ausgelöst.
Implementierung eigener Exceptions:
Subklassenbildung von Exception
Eigene Exception: Ableitung der Klasse Exception
public class IDException extends Exception {
public IDException() {
}
public IDException(int id) {
super("Illegal id: " + id);
}
}
-1414-
Erbt getMessage(),
printStackTrace(),
…
Ausnahmebehandlung
Und wie behandelt man die Fehler?
JVM Standardausnahmebehandlung
Stack-Trace Ausgabe, Abbruch des Programms
Explizit: try-catch(-finally) Anweisung
Benutzerdefiniertes Verhalten bei Ausnahmen
-1515-
try{{}:}:
try
try-catch-finally
Trittim
imtry-Block
try-Blockeine
eine
Tritt
Ausnahmevom
vom Typ
Typdes
des
Ausnahme
Parametersauf:
auf:Ausführung
Ausführungdes
des
Parameters
catch-Blocks.
catch-Blocks.
try {
Anweisungenim
im try-Block,
try-Block, die
die
Anweisungen
// Block, in dem der riskante Code
hinter der
derAnweisung
Anweisung liegen,
liegen, die
die
hinter
// steht bzw. in dem abzufangende
dieAusnahme
Ausnahmeverursacht
verursacht hat,
hat,
die
// Ausnahmen auftreten können
werdennicht
nicht mehr
mehrausgeführt
ausgeführt
werden
} catch (Exception e) {
// Block, in dem steht, was bei Auftreten
// einer Ausnahme geschehen soll.
// Mehrere sukzessive catch-Blöcke möglich
} finally {
// wird in jedem Fall ausgeführt
}
-1616-
try-catch-finally
catch(Parameter){ ...}
Block mit Anweisungen, die festlegen,
was bei Auftreten einer Ausnahme
geschehen soll.
try {
Parameter-Typ: (Subklasse von)
// Block, in dem der riskante
Code
Throwable
// steht bzw. in dem abzufangende
Mehrere catch-Blöcke mit
// Ausnahmen auftreten können
unterschiedlichen Exception-Typen
} catch (Exception e) {
möglich
// Block, in dem steht, was bei Auftreten
Differenzierung von unterschiedlichen
// einer Ausnahme geschehen soll.
Fehlern.
// Mehrere sukzessive catch-Blöcke möglich
Bei mehreren catch-Blöcken:
Werden in der Reihenfolge ihres
} finally {
Auftretens berücksichtigt.
// wird in jedem Fall ausgeführt
}
Wurde ein catch-Block ausgeführt,
werden die danach stehenden Blöcke
nicht mehr ausgeführt.
-1717-
Beispielimplementierung mit try-catch Behandlung
public class HandledDivider {
public static void main(String args[]) {
int a = 10, b = 0, result=0;
try {
result = a / b;
} catch ( ArithmeticException e1 ){
System.out.print("Exception detected. Reason: "+
e1.getMessage());
return;
}
System.out.println(result);
System.out.println("Good bye!");
}
}
Exception
Exception detected.
detected. Reason:
Reason: // by
by zero
zero
-1818-
(try-catch-) finally
finally {...} : Block mit Anweisungen, der in
jedem Fall ausgeführt wird:
-1919-
Wenn der try-Block ohne Auftreten einer Ausnahme
durchlaufen wird
Wenn eine Ausnahme in einem der catch-Blöcke
behandelt wurde
Wenn eine Ausnahme in keinem der catch-Blöcke
behandelt wurde
Wenn der try-Block durch (break oder) return
verlassen wurde
finally-Beispiel (und Differenzierung von Fehlern)
public class HandledArrayIndex {
public static void main(String[] args) {
int[] intArr = new int[2];
double r=0;
try {
intArr[0] = 4;
intArr[1] = 0;
intArr[2] = 0;
//r = intArr[0] / intArr[1];
} catch (ArrayIndexOutOfBoundsException e1) {
System.out.println("Exception detected.Illegal index:"+
e1.getMessage()); return;
} catch (ArithmeticException e2) {
System.out.println("Exception detected.Illegal division:"
+ e2.getMessage()); return;
} finally {
System.out.println(r);
}
System.out.println("End of program!");
}
Exception detected.Illegal index:2
}
0.0
Exception detected.Illegal division:/ by zero
-20200.0
Gruppierung/Verallgemeinerung von Fehlern
public class HandledArrayIndex2 {
public static void main(String[] args) {
int[] intArr = new int[2]; double r=0;
try {
intArr[0] = 4;
intArr[1] = 0;
//intArr[2] = 0;
r = intArr[0] / intArr[1];
} catch (Exception e) {
System.out.println("Exception detected: "+
e.getMessage());
return;
}
finally {
System.out.println(r);
}
System.out.println("Bye");
}
}
Exception detected: / by zero
-21210.0
Abfangen, Signalisieren, Weitergeben von Ausnahmen
Kontrollierte Ausnahmen müssen
-2222-
entweder abgefangen werden (try-catch)
oder an den Aufrufer weitergegeben werden (throw,
throws)
Der Compiler achtet auf die Einhaltung dieser
Regel!
throws
throws Exception-Liste
Wird die Ausnahme nicht in der sie auslösenden
Methode behandelt, muss sie weitergereicht werden
throws-Klausel in der Methodendeklaration
Exception-Liste
Eine oder mehrere (durch Komma getrennte)
Ausnahmen. Beispiel:
public void myMethod () throws
ArrayIndexOutOfBoundsException,
FileNotFoundException { … }
-2323-
Beispiel/Illustration: Weiterreichen von Exceptions
Kein throws, da try-catch Behandlung
void methode1() {
try {
methode2();
} catch (ArithmeticException ae) {
// Fehlerbehandlung
}
}
START:
methode1 wird aufgerufen
Programmfluss
void methode2() throws ArithmeticException{ methode3(); }
void methode3() throws ArithmeticException{ rechnen(); }
void rechnen() throws ArithmeticException{
System.out.println(1/0);
}
Ausnahme tritt auf in rechnen()-Methode. Keine
Behandlung: Compiler verpflichtet zu throws.
Exception wird »nach oben« weitergeworfen/-gereicht.
-2424-
Programmfluss
Weiterreichen/Behandlung der Exception
throw
throw Ausnahmeobjekt
throw unterbricht das Programm an der
implementierten Stelle, um …
(1) die Ausnahme zu behandeln
(2) oder die Weitergabe auszuführen.
-2525-
Weitergabe muss im Methodenkopf angegeben
werden: throws Exception-Liste
throw-Beispiel (1: Weiterreichen der Exception)
public class Person {
private int persNummer;
public Person(int persNummer) throws IDException {
if (persNummer < 1 || persNummer > 100) {
throw new IDException(persNummer);
}
this.persNummer = persNummer;
}
}
-2626-
public static void main(String[] args) {
try {
Person p = new Person(-12);
} catch ( IDException e ) {
e.printStackTrace(); System.exit(-1);
}
}
IDException:
IDException: Illegal
Illegal id:
id: -12
-12
at
at Person.<init>(Person.java:6)
Person.<init>(Person.java:6)
at
at Person.main(Person.java:13)
Person.main(Person.java:13)
throw-Beispiel (2: Behandeln der Exception)
public class Person2 {
private int persNummer;
public Person2(int persNummer) {
if (persNummer < 1 || persNummer > 100) {
try {
throw new IDException(persNummer);
} catch (IDException e) {
e.printStackTrace();
}
}
this.persNummer = persNummer;
}
public static void main(String[] args) {
Person p = new Person(-12);
}
}
-2727-
Teil-Behandlung von Exceptions (try-catch und throws)
public class HandledArrayIndex {
public static void main(String[] args) throws ArithmeticException {
int[] intArr = new int[2]; double r=0;
try {
intArr[0] = 4;
intArr[1] = 0;
//intArr[2] = 0;
r = intArr[0] / intArr[1];
} catch (ArrayIndexOutOfBoundsException e1) {
System.out.println("Exception detected:"+
e1.getMessage());
return;
}
finally {
System.out.println(r);
}
System.out.println("Bye");
}
}
-2828-
Stack-Trace
public class Test {
void methode1() { methode2(); }
void methode2() throws ArithmeticException{ methode3(); }
void methode3() throws ArithmeticException{ rechnen(); }
void rechnen() throws ArithmeticException{System.out.println(1/0); }
}
public static void main(String[] args) {
Test t = new Test();
t.methode1();
}
Exception
Exception in
in thread
thread "main"
"main"
java.lang.ArithmeticException:
java.lang.ArithmeticException: // by
by zero
zero
at
at Test.rechnen(Test.java:13)
Test.rechnen(Test.java:13)
at
at Test.methode3(Test.java:10)
Test.methode3(Test.java:10)
at
at Test.methode2(Test.java:8)
Test.methode2(Test.java:8)
at
at Test.methode1(Test.java:4)
Test.methode1(Test.java:4)
at
at Test.main(Test.java:19)
Test.main(Test.java:19)
-2929-
Diverses
Morgen ab 17.00 Uhr auf »unserer« Seite: Hausaufgabe
Themen der Klausur:
-3030-
Multiple Choice
Implementierungsbeschreibungen, Erklärungen zu OOP
Kleinere Implementierungen
Mini-Programm
Hinweis: Es reicht nicht, sich nur die Folien durchzulesen.
Alle bisherigen Themen, inklusive Ausnahmebehandlung
Struktur/Allg. Inhalte der Klausur:
http://www.uni-due.de/computerlinguistik/prog0708.shtml
Verwenden Sie unterstützend eines der vorgeschlagenen Bücher und lesen
Sie das/die Kapitel zum jeweiligen Konzept einer Folie.
Lösen und verstehen Sie die Übungsaufgaben.
Bringen Sie Ihren Studenten- und Personalausweis mit!
Donnerstagsübung nächste Woche: Nach Möglichkeit
vorherige Übungen besuchen.
Herunterladen