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-