exceptions

Werbung
Learning By Doing
Exceptions (Ausnahmebehandlung)
• Typische Fehlverhalten zur Laufzeit:
- Verwendung von null-Objekten
- Illegale mathematische Operationen
- Aufruf einer Methode mit Parametern ausserhalb
des erlaubten Bereichs
(Nichteinhaltung der Preconditions)
Turtle t;
t.forward(100);
int a = 2;
int b = 0;
int c = a / b;
- Eingabewerte ausserhalb des erlaubten Bereichs
(Inputvalidation)
- Überlauf von reservierten Speicherbereichen
(Arrayindex, Stringlängen, Memorypools)
• Typische Reaktionen:
- Programm od. Computer hängt ohne Fehlermeldung (Absturz)
- Fehlermeldung und Möglichkeit, das Programm höflich zu beenden
• Hauptproblem:
- Schwierig voraussehbar, was alles schief gehen kann (defensive Programmierung)
- Fehler kann in einem gewissen Bereich des Programms auftreten. Nach Fehler
muss man aus diesem Bereich hinausspringen und den Fehler in einem Fehlerhandler bearbeiten (unstrukturierte Programmierung, goto)
s. Buch S. 287ff
Learning By Doing
try-catch-Blöcke
try
{
...
BbbException geworfen
}
catch (AaaException ex)
{
}
catch (BbbException ex)
{
}
finally
{
}
...
Learning By Doing
// WbzEx16.java
import ch.aplu.util.*;
Ohne Fehlerabfang
public class WbzEx16
{
private int[] a = new int[2];
public WbzEx16()
{
System.out.println(
"Array mit zwei Elementen.\n" +
"Weise dem zweiten einen Wert zu...");
a[2] = 6;
System.out.println("hier geht's weiter");
}
public static void main(String[] args)
{
Console.init();
new WbzEx16();
}
}
Nichts geht
weiter
Learning By Doing
// WbzEx16a.java
import ch.aplu.util.*;
Mit Fehlerabfang
public class WbzEx16a
{
private int[] a = new int[2];
public WbzEx16a()
{
System.out.println(
"Array mit zwei Elementen.\n" +
"Weise dem zweiten einen Wert zu...");
try
{
a[2] = 6;
}
catch (Exception ex)
{
System.out.println("Exception gefangen");
System.out.println(ex);
}
System.out.println("Hier geht's weiter...");
}
public static void main(String[] args)
{
Console.init();
new WbzEx16a();
}
}
Schon
besser
Learning By Doing
Klassenhierarchie der Exceptions
Throwable
Error
...
Exception
RuntimeException
IOException
...
Wirft eine Methode eine Exception, so gilt:
• Explizite Exceptions müssen abgefangen werden (grau)
Beispiel: FileNotFoundException (Subklasse von IOException)
• Implizite Exceptions können abgefangen werden
Beispiel: ArrayIndexOutOfBoundsException (Subklasse von RuntimeException)
Learning By Doing
Exceptions "nach oben werfen"
// WbzEx17.java
import ch.aplu.util.*;
public class WbzEx17
{
public WbzEx17() throws Exception
{
System.out.println("Gehe schlafen, szssss...");
Thread.currentThread().sleep(3000);
System.out.println("bin wieder aufgewacht.");
}
Kein guter
Programmierstil
}
public static void main(String[] args) throws Exception
{
Console.init();
Aber voller
new WbzEx17();
try-catch-Blöcke
}
auch nicht!
Herunterladen