Lektion 6: Ausnahmebehandlung Übersicht

Werbung
Lektion 6: Ausnahmebehandlung
Helmar Burkhart
Informatik
Universität Basel
[email protected]
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-0
Übersicht Lektion 6
• Fehler und Ausnahmen
• Behandlungsstrategien
• Java Sprachkonstrukte
• Häufige Ausnahmen
• Eigene Ausnahmen
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-1
Ausnahmen
• Eine Ausnahme (exception) ist ein Ereignis, das den
normalen Ablauf eines Programms beeinflusst.
• Ursache 1: Programmierfehler:
- Zugriff auf ein Feld mit falschem Index
- Zugriff auf Objekt ohne gültige Referenz
- Fehler bei arithmetischen Berechnungen
• Ursache 2: Zugriff auf nicht vorhandene Betriebsmittel
- zu wenig vorhandener Speicherplatz
• Java besitzt einen allgemeinen Mechanismus, um
Ausnahmen abzufangen, die sog. Ausnahmebehandlung.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-2
Verwobene Ausnahmebehandlung (1)
Bei der traditionellen Ausnahmebehandlung erfolgt die
Fehlererkennung und Reaktion stark verwoben mit dem
eigentlichen Programmcode.
Beispiel: Eine Methode readFile liest eine Datei
gesamthaft in den Hauptspeicher ein.
readFile(){
Datei öffnen und Grösse bestimmen
Hauptspeicherplatz dieser Grösse reservieren
Dateiinhalt im Speicher ablegen
Datei schliessen}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-3
Verwobene Ausnahmebehandlung (2)
Auf den ersten Blick erscheint diese Methode einfach zu
implementieren. Allerdings könnten einige Probleme auftreten:
• Was passiert, wenn die Datei nicht geöffnet werden kann ?
• Was passiert wenn die Grösse nicht bestimmbar ist ?
• Was passiert wenn nicht genug Hauptspeicherplatz zur
Verfügung steht ?
• Was passiert wenn der Lesevorgang scheitert ?
• Was passiert, wenn die Datei nicht mehr geschlossen
werden kann ?
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-4
Verwobene Ausnahmebehandlung (3)
int readFile(){
int errorCode = 0;
Datei öffnen;
if (Datei_geöffnet){
Grösse bestimmen;
Nach jeder Aktion wird
gleich geprüft, ob diese
erfolgreich war.
if (Grösse_bestimmt){
Hauptspeicherplatz reservieren;
if (Hauptspeicher_reserviert){...}
else errorCode = -1; }
else errorCode = -2;}
else errorCode = -3;
return errorCode;
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-5
Ausnahmebehandlung in Java (1)
Java unterstützt eine strukturierte Fehlerbehandlung bei der
der eigentliche Programmcode getrennt von der Behandlung
gehalten wird.
readFile(){
try{Datei öffnen; Grösse bestimmen;
Hauptspeicherplatz reservieren;
Ausnahmen
werden
ausgelöst
(throw)
Dateiinhalt im Speicher ablegen;
Datei schliessen}
catch(Datei_nicht_geöffnet){...}
catch(Grösse_nicht_bestimmbar){...}
catch(Speicherplatz_ungenügend){...}
Ausnahmen
werden
abgefangen
(catch)
...}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-6
Ausnahmebehandlung in Java (2)
Java unterstützt das hierarchische Rückmelden von
Ausnahmesituationen entlang der Methodenaufrufkette:
method1(){
method1
try{ method2();}
catch (Exception e){...} }
method2
method2() throws Exception{
method3
method3();}
method3() throws Exception{
readFile
readFile();}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-7
Ausnahmebehandlung in Java (3)
• Ausnahmen sind in die Objekthierarchie eingebettet.
• Tritt während der Programmausführung eine Ausnahmesituation auf, erzeugt der Java-Interpreter eine Beschreibung
(Exception-Objekt).
• Das Exception-Objekt enthält Informationen über die Art des
Fehlers.
Klasse Throwable:
• getMessage(): Ausgabe einer Beschreibung
• printStackTrace(): Ausgabe der Aufrufkette
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-8
Klassenhierarchie der Ausnahmen
Object
Throwable
Error
Diese beiden Typen
werden nicht vom
Compiler geprüft
(ungeprüfte
Ausnahmen).
Institut für Informatik
Universität Basel
Exception
RuntimeException
......
IOException
UnsupportedLookAndFeelException
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-9
Beispiel: java.util.Stack
Stack s = new Stack(); s.pop();
public Object pop()
Removes the object at the top of this stack and returns that object as the value
of this function.
Returns: The object at the top of this stack (the last item of the Vector object).
Throws:
EmptyStackException - if this stack is empty.
Erweitert RuntimeException: Keine Kompilationsmeldung;
kein try-catch zwingend.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-10
try - catch - finally
•
try-catch-finally ist das Sprachmittel von Java um
Ausnahmesituationen zu bearbeiten.
• Die Anweisung besteht aus 3 Teilen, wobei der catch-Teil
bzw. der finally-Teil (aber nicht beide zugleich) fehlen kann.
• Catch-Teil muss direkt nach try folgen.
try{Anweisungsfolge, die Ausnahme auslösen kann }
catch(SomeException e1){Ausnahmebehandlung}
... evtl. noch mehr catch-Blöcke
catch(AnotherException e2){Ausnahmebehandlung}
finally{Abschlussanweisungen: werden "immer" ausgeführt}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-11
Beispiel: javax.swing.UIManager
try {
UIManager.setLookAndFeel(layoutName);
SwingUtilities.updateComponentTreeUI(
getParent());
}
catch (Exception exc) {...}
public static void setLookAndFeel(String className)
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException,
UnsupportedLookAndFeelException
Muss behandelt werden.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-12
Methodendirektive throws
Falls eine Anweisung des Methodenkörpers eine geprüfte
Ausnahme auslösen kann oder selber mittels der throwAnweisung eine solche auslöst, muss entweder
• eine Behandlung mittels try-catch erfolgen.
• eine Weiterleitung mittels der throws-Direktive
erfolgen.
Methodenname (Parameterteil) throws Exception{...}
String readFirstLine(String FileName)
throws IOException{...}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-13
Ausnahmen präzis behandeln (1)
• Ausnahmen sollten so präzis wie möglich eingegrenzt
werden.
• Vages Abfangen:
public void
vage(){
double [] a = new double [10];
try{ for (int i=0; i<=10; i++)
a[i]=1/i;}
catch (Exception e)
{System.out.println("Achtung Fehler");}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-14
Ausnahmen präzis behandeln (2)
public void
präzise(){
double [] a = new double [10];
try{ for (int i=0; i<=10; i++)
a[i]=1/i;}
catch (ArrayIndexOutOfBoundsException e)
{System.out.println("Falscher Index");}
catch (ArithmeticException e)
{System.out.println("Arithmetischer
Fehler"}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-15
Häufig vorkommende Ausnahmen (1)
Standard-Laufzeitfehler (RuntimeException)
ArithmeticException
ArrayStoreException
ClassCastException
IndexOutOfBoundsException
NullPointerException
EmptyStackException (java.util)
Fehler (Error)
StackOverflowError
OutOfMemoryError
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-16
Häufig vorkommende Ausnahmen (2)
Geprüfte Ausnahmen
ClassNotFoundException
CloneNotSupportedException
InstantiationException
IOException (java.io)
MalformedURLException
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-17
Definieren eigener Ausnahmen
Definieren einer Ausnahmeklasse abgeleitet von Exception
bzw. einer der Unterklassen.
class TestException extends Exception{...}
Mit Hilfe der throw-Anweisung können Ausnahmen
explizit vom Programm ausgelöst werden.
throw new TestException("Testnachricht");
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-18
Abschlussaktivitäten: finally
Im finally-Teil werden alle Arten von Abschlussarbeiten
platziert (allgemeines Aufräumen). Die Anweisungen im
finally-Block werden garantiert ausgeführt und zwar immer
nach dem try-Block. Folgende Varianten sind möglich:
• Normales, komplettes Durchlaufen des try-Teils.
• Abbruch in try mittels break, continue oder return.
• Nach Ausnahme und Behandlung in catch-Teil.
• Nach Ausnahme, die nicht abgefangen wurde, vor
Weiterleitung nach „oben“.
Sonderfall: System.exit() in try-Teil vermeiden.
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-19
Ausnahme vs. Fallunterscheidung
Stack s = new Stack();
void m1(){
for (int i =1; i<=100000; i++){
if (!s.empty()) s.pop();}
}
void m2(){
for (int i =1; i<=100000; i++){
try{s.pop();}
catch(EmptyStackException e)
{}
}
Institut für Informatik
Universität Basel
EINFÜHRUNG IN DIE INFORMATIK II
Lektion 6: Ausnahmebehandlung
6-20
Herunterladen