Exception Handling – Ausnahmebehandlungen

Werbung
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Exception Handling – Ausnahmebehandlungen Während der normalen Abarbeitung einer Methode kann zur Laufzeit ein abnormales Ereignis auftreten, das die normale Ausführung der Methode unterbricht. Î_________________________________________________________________________ Beispiele: ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ ÎException= Laufzeit‐Ereignis Î Laufzeit‐Fehler des Programmes Wir wollen aber stabile Programme. Î dass man Programmcode zur Erkennung und Behandlung von Exceptions vorsehen muss. Häufige Quelle z.B. Ein‐Ausgabeoperationen. Es muss uns vorher bekannt sein, dass eine aufgerufene Methode riskant ist, das heißt, dass sie eine Exception auslösen könnte. Sonst können wir ja keinen Code schreiben, der mit ihr fertig wird. Woher haben wir diese Information? In der API, d.h. in der Deklaration der riskanten Methode steht eine throws‐Klausel (es wird eine Exception geworfen). D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
1
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
class meinekl
{
public static void main(String[] args)
{
try
{
int zahl = Integer.parseInt("munz");
System.out.print(zahl);
}
catch (NumberFormatException ex)
{
System.out.print("Der Wert konnte nicht umgewandelt werden.");
}
}
}
http://java.sun.com/j2se/1.5.0/docs/api/index.html Also die Methode ParseInt wirft uns die ausgelöste Exception zu. In JAVA haben alle Exceptions eine gemeinsame Basisklasse. Dies ist die Klasse Throwable aus dem paket java.lang. D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
2
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
3
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Wiederholen wir das Ganze noch einmal. D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
4
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Das Leben ist kurz, vor allem auf dem Heap. Exceptions sind Objekte vom Typ Exception. Was ist nun in JAVA anderst???? Wir packen alles in einen try – catch Block. Er sagt dem Compiler, dass wir wissen, dass eine Exception auftreten kann, und wir darauf reagieren können. Wie ist dem Compiler egal. class meinekl2
{
public static void main(String[] args)
{
try
{
int zahl = Integer.parseInt("munz");
System.out.print(zahl);
}
catch (NumberFormatException ex)
{
System.out.print(ex.getMessage());
}
}
}
Alle Klassen, die in Java zur Identifizierung von Ausnahmesituationen verwendet werden, sind von der Klasse java.lang.Throwable abgeleitet ‐ so auch NumberFormatException. Die Klasse Throwable definiert unter anderem eine Methode getMessage(), die durch Vererbung auch allen anderen Klassen im Zusammenhang mit Exception Handling zur Verfügung steht ‐ also auch NumberFormatException. Diese Methode gibt eine Fehlerbeschreibung vom Typ String zurück, die im obigen Beispiel nun einfach auf die Standardausgabe ausgegeben wird. (InterruptedException=Runtime Exception) Das Exception ‐ Handling wird streng von der Standardbibliothek bestimmt. Alle Fehlerklassen werden in Java vom Objekt Throwable abgeleitet, welches umfangreiche Standardoperationen zur Behandlung von Fehlern beinhaltet. Alle als Ausnahme verwendeten Klassen reihen sich also in eine feste Hierarchie ein. D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
5
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Was wir in einen catch‐Block schreiben, hängt ab davon, welche Exception ausgelöst wurde. Beispiele: ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ ________________________________________________________________________________________________________ D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
6
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
7
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Zusammenfassung •
Konzeptionelle Sicherheit o Prämisse: Programme sollen möglichst nie abstürzen o Signalisieren einer Aussnahmesituation o Reaktion auf Exceptions definierbar •
Behandlung von Exceptions o Abfangen einer Exception mit einer try‐Anweisung o Reagieren auf eine Exception mit optionalen catch‐Anweisungen o Verzeicht auf lokale Fehlerbehandlung mit der throws‐Klausel im Methodenkopf o Abschlußaufgaben sicherstellen mit der finally‐Anweisung •
Exceptions sind Objekte o Abstammung von Throwable o Enthält Informationen über: ƒ speziellen Fehlerfall ƒ Aufrufhierarchie Lokale Fehlerbehandlung class myClass {
public int quotient(int a, b) {
try {
return a / b;
}
catch (ArithmeticException e) {
System.err.println("Err: " + e);
return -1;
}
}
}
// Hier tritt eine Exception auf,
// wenn b 0 ist
// Fehlermeldung ausgeben
// Auf die Exception reagieren
Verzicht auf lokale Fehlerbehandlung class myClass {
public int quotient(int a, b) throws Arithmetic Exception {
return a / b;
// Eine Exception wird an den nächst}
// höheren Programmblock weitergeleitet
}
D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
8
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Beispiele: Eigene Exception Haben Ausnahmen ganz bestimmte spezifische Eigenschaften, die im Klassenbaum der Exceptions noch nicht vertreten sind, so wird man eine spezielle Klasse vereinbaren. Da Exceptions nichts anderes als Klassen sind, leitet man sich für seine Bedürfnisse einfach eine Klasse von der Klasse Exceptions ab. Dadurch können die Exceptions unterschieden und modifizierte Fehlermeldungen angegeben werden. Das folgende Beispiel zeigt, wie man eine selbst definierte Exception generieren, auswerfen und wieder fangen kann. // Datei: MyClass.java class MyException extends Exception { MyException() { // Aufruf des Konstruktors der Klasse Exception. // Ihm wird ein String mit dem Fehlertext übergeben. super ("Fehler ist aufgetreten!"); } } public class MyClass { public static void main (String[] args) { // Dieser try‐Block ist untypisch, da in ihm nur eine // Exception zu Demonstrationszwecken geworfen wird. try { MyException ex = new MyException(); throw ex; // Anweisungen unterhalb einer throw‐Anweisung in einem // try‐Block werden nie abgearbeitet. } catch (MyException e) { System.out.println (e.getMessage()); } } } D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
9
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Bereichsgrenzen eines Arrays werden überschritten. public class Test { public static void main (String[] args) { int[] intarr = new int [4]; for (int lv = 0; lv < 8; lv++) { try { intarr [lv] = lv; System.out.println (intarr [lv]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println ("Arrayindex " + lv + " ist zu gross!"); } } } } Im folgenden Beispiel wird ein Kompilierungsfehler durch ein nicht erreichbares catch‐Konstrukt demonstriert. class MyException extends Exception { MyException() { super ("Fehler ist aufgetreten!"); } } public class Catchtest { void testMethode() { try { throw new MyException(); } catch (Exception e) { System.out.println (e.getMessage()); } catch (MyException e) { System.out.println (e.getMessage()); } } public static void main (String[] args) { Catchtest x = new Catchtest(); x.testMethode(); } } D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
10
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Try Anweisungen können auch geschachtelt werden. Î mehrere Schichten zur Fehlerbehandlung class MyException extends Exception { MyException() { super ("Fehler ist aufgetreten!"); } } public class Versuch { public static void main (String[] args) { boolean test = false; // Auswurf von Exception //test = true; // Auswurf von MyException try { try { if (test) throw new MyException(); throw new Exception(); } catch (MyException e) { System.out.println ("MyException gefangen"); } } catch (Exception e2) { System.out.println ("Exception gefangen"); } } } D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
11
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
// Datei: DatumEingabe.java import java.util.Date; import java.text.*; public class DatumEingabe { public Date pruefeDatum (String datum) throws ParseException { // eine auf die Rechnerlokation abgestimmte Instanz der Klasse // DateFormat wird erzeugt. DateFormat df = DateFormat.getDateInstance(); // strenge Datumsprüfung einschalten df.setLenient (false); // Datum überprüfen und in ein Date Objekt wandeln. // Die Methode parse() wirft eine ParseException, wenn in // datum kein gültiges Datum steht. Date d = df.parse (datum); return d; } public static void main (String[] args) { DatumEingabe v = new DatumEingabe(); Date datum = null; String[] eingabe = {"10.10.1999", "10.13.1999"}; for (int i = 0; i < eingabe.length; i++) { try { datum = v.pruefeDatum (eingabe [i]); System.out.println ("Eingegebenes Datum ist ok:\n" + datum); } catch (ParseException e) { System.out.println ("Eingegebenes Datum ist nicht ok:\n" + eingabe); } } } } D:\Dokumente und Einstellungen\Munz\Desktop\Technische Informatik\FTE2\Exceptions\Except1.doc
12
Herunterladen