Java FH Merseburg SS 2002 Ausnahmen / Exceptions während der Objektlebenszeit können Fehler auftreten: Eingabefehler, Programmfehler, ungewöhnliche Zusstände anderer Objekte etc. Problem: Fehler müssen abgefangen werden u. U. recht aufwendig Java Konzept der Ausnahmebehandlung: eine Ausnahme wird ausgelöst, wenn eine unerwartete Fehlerbedingung auftritt Anweisungen, in denen Fehler auftreten könnten, werden zusammengefaßt try-Block Falls es bei der Ausführung der Anweisungen im try-Block zu Ausnahmen kommt, werden diese im folgenden catch-Block behandelt, d. h. es wird darauf reagiert try { // Anweisungen, in denen Fehler auftreten können } catch (Exception1 e){ // e = lokale Referenzvariable // Behandlung der Ausnahmen vom Typ 1 } catch (Exception2 e){ // Behandlung der Ausnahmen vom Typ 2 } finally { // Anweisungen zum Beenden des try-Blockes } saubere einfache Art, Fehler abzufangen, ohne den Quelltext zu überfrachten exception = Signal an das Objekt, daß eine Bedingung eingetreten ist, die besondere Behandlung erfordert siehe Beispielprogramm waitForReturn: public static void waitForReturn () { BufferedReader din = new BufferedReader(new InputStreamReader(System.in)); try { System.out.println("\nBitte Return-Taste druecken..."); din.readLine(); } catch (IOException e) { System.err.println("Fehler: "+e); } } try-Block ist ´normaler´ Block wird Ausnahmebehandlung beendet auch durch break, continue, return durch die Anforderung einer catch-Block kein, ein oder mehrere catch-Blöcke möglich, die auf Exceptions des tryBlockes reagieren Ursachen der Exceptions werden beseitigt (Ressourcen freigeben oder neue Ausnahmen anstoßen) 481352545 -1- Java FH Merseburg SS 2002 Definition wie Methode: Parameter ist ein Objekt der Klasse Throwable oder einer ihrer Unterklassen Ablauf der Ausnahembehandlung: Wenn eine Ausnahme der Klasse IOException angefordert wird, wird der catch-Block mit einem Paramter IOException oder einer Basisklasse von IOException angesprungen und die Anweisungen des Blockes werden ausgeführt. finally-Block Anweisungen, die nach dem try-Block oder der Ausnahmebehandlung des catch-Blockes ausgeführt werden sollten Freigabe von Ressourcen etc. vergleichbar der finalize-Methode beim GC Wird immer ausgeführt, auch nach return, break, continue Ist kein passender catch-Block vorhanden, wird erst der finally-Block ausgeführt und dann beendet der Compiler mit dem Namen der Ausnahme und der beim Erzeugen der Ausnahme angegebenen Meldung Exceptions sollten nur behandelt werden, wenn normalerweise nicht auftretende Ereignisse eintreten Wird die Ausnahme nicht abgefangen, tritt standardmäßige Ausnahmebehandlung in Kraft Ausnahmen sind Klassen Exceptions sind eigene Klassen es gibt eine Klasse pro Ausnahmetyp Sind abgeleitet von der Klasse Throwable bzw. einer ihrer Unterklassen Error oder Exception Error: Probleme des Linkers beim dynamischen Laden Programmteilen (Probleme mit der virtuellen Java Maschine) Stellen schwerwiegende Fehler dar und sollten nicht korrigiert werden von Klasse Throwable enthält eine Objektkomponente vom Typ String, die eine Meldung für den Benutzer über den Grund der Ex. Enthält eine Methode getMessage() zur Ausgabe des Strings mögliche Ausnahmen Eigene Ausnahmen Eigene Ausnahmen von Exception ableiten class Exception1 extends Exception { public Exception1(){ super(); } public exception1(String s){ super(s); } } Motivation für eigene Ausnahmen: Reaktion auf spezielle Fehlersituationen Benutzerlesbaren Fehlertext erzeugen Daten, die Ausnahme ausgelöst haben, speichern Beispiel: eine eingegebene Personalnummer wird nicht gefunden 481352545 -2- Java FH Merseburg SS 2002 public class PersNrNichtGefundenException extends Exception { public String persNr; public Object person; // Konstruktor PersNrNichtGefundenException (String persNr, Object person) { Super (“Keinen Namen mit der Personalnummer“+ persNr +“ gefunden.“) // merken der Daten, die Fehler hervorgerufen haben this.persNr = perNr; this.person = person; } } Auslösen von Ausnahmen erzeugen von Ausnahmen durch throw throw new Exception1 („Die eigene Ausnahme 1 ist aufgetreten); ändern des Namens eines Mitarbeiters durch Vorgabe einer Personalnummer public void aendereNamen (String persNr, Object person) throws PersNrNichtGefundenException { Person pers = find(persNr); if (pers == null) // wenn persNr nicht vorhanden // erzeugen eines Objektes der Klasse PersNr.... throw new PersNrNichtGefundenException(persNr, this); // wenn persNr existiert, dann verarbeiten ... } Das throws-Konstrukt throws gibt an, welche Ausnahmen eine Methode erzeugen kann = Deklaration der auslösbaren zu berücksichtigenden Ausnahmen (checked exceptions) public static void main (String[] args) throws IOException ... } { oder eine Liste von Ausnahmen public void test throws Exception1, Exception2 { ... } statt der Aufzählung mehrerer Exceptions kann auch die Basisklasse benutzt werden protected void finalize() throws Throwable { // siehe Garbage Collector super.finalize(); close(); } Möglichkeiten zur Behandlung der throws-Ausnahmen: Ausnahme abfangen und behandeln Ausnahme abfangen und auf eigne A. abbilden mit throw selbst auslösen ohne Behandlung die Methode passieren lassen man darf nur Ausnahmen auslösen, die im throws-Konstrukt angegeben sind 481352545 -3- Java FH Merseburg SS 2002 das Fehlen von throws bedeutet, daß keine Ausnahmen ausgeführt werden kann führt u.U. zu Compilerfehlern Exception-Hierarchie Object Throwable Exception Error AbstractMethodError ... (andere Exceptions) RuntimeException ... ... IndexOutOfBoundsException NullPointerException NumberFormatException ... *** 481352545 -4-