Exceptions
In Java gibt es eine eigene Art, mit Ausnahmen und Fehler umzugehen - das sogenannte Exception-Handling. In der Internetprogrammierung (aus der Java ursprünglich stammt) muss man auf alle Situationen gefasst sein, Abstürze sind nicht akzeptabel - was aber jetzt tun, wenn die Verbindung nicht zustande kommt?
Zu diesem Zweck dienen Exceptions - sie werden im Ausnahmefall erzeugt und mit dem Schlüsselwort throw "geworfen". Die Basisklasse aller Ausnahmen in Java ist die Klasse java.lang.Throwable, davon abgeleitet werden Error und Exception. Eine geworfene Exception ist dabei nichts anderes als ein Objekt der Klasse Excption bzw. deren Unterklassen, das zur Laufzeit erzeugt wird, und dann aufgefangen werden kann. Man kann sich beliebig eigene Exceptions programmieren, indem man eine Klasse von Exception oder einer Unterklasse davon ableitet.
Erschaffen einer eigenen Exception:
class MyException extends Exception{
public MyException(String reason){
super(reason);
}
}
Das ist die einfachste Art einer eigenen Exception, die lediglich einen Konstruktor besitzt. Der Konstruktor übernimmt lediglich eine detailliertere Fehlermeldung und ruft damit den Konstruktor der Oberklasse auf. Zusätzlich erbt MyException unter anderem eine Methode toString(), mit der man sich einen String mit Details ausgeben lassen kann.
"Werfen" einer eigenen Exception:
public void doTest(int i) throws Exception{
if (i==0) throw new MyException("Illegal Character!");
System.out.println(10/i);
}
Was macht diese Methode? Gleich im Methodenkopf steht der Zusatz "throws Exception" - das muss so sein, sofern die Exception nicht von RuntimeException abgeleitet wurde, sonst wird die Methode vom Compiler zurückgewiesen. Ein Integer-Wert i wird übernommen, und dann wird geprüft, ob der Wert 0 ist - wenn er 0 ist, dann wird eine MyException erzeugt und geworfen, und alles, was in der Methode darunter steht, wird nicht mehr ausgeführt!
Auffangen einer Exception:
public void doOtherTest() throws Exception{
try{
doTest(0);
} catch (Exception e){
System.out.println(e.toString());
} finally{
System.out.println("test done!");
}
}
Was passiert in dieser Methode? Auch hier muss zuerst im Methodenkopf der Zusatz "throws Exception" eingetragen werden.
Mit try können mehrere Anwesungen ausprobiert werden, ohne im Fehlerfall gleich zum Programmabsturz zu führen. Sollte tatsächlich im try-Block eine Exception auftreten, dann wird in der entsprechenden Zeile abgebrochen (die verbleibenden Zeilen werden nicht abgearbeitet) und zur catch-Anweisung übergegangen. In der catch-Anweisung steht, welche Exception abgefangen werden soll. Die Anweisung "catch (Exception e)" würde alle Exceptions und alle von ihr abgeleiteten Unterklassen abfangen, jedoch nicht Error und auch nicht Throwable. Man kann sich das so vorstellen, dass im catch-Block alles abgefangen wird, was in der Klassenhierarchie "unterhalb" der angegebenen Klasse steht. Nach dem catch kann man Anweisungen schreiben, die nach dem Auftreten eines Fehlers gemacht werden wollen - diese werden nur dann ausgeführt, wenn wirklich ein Fehler aufgetreten ist. Die finally-Anweisung ist optional, man kann sie also auch weglassen. Sie wird in JEDEM Fall aufgerufen und behandelt.
Leitet man eine Exception von der Klasse RuntimeException ab, so spart man sich die Erweiterung der Methodenköpfe um "throws Exception".