Eine Ausnahmen ist ein abnormales Ereignis, was eine Methode oder auch einen Konstruktor unterbricht.
Die Behandlung von Ausnahmen wird im try-Block zusammengefasst. Man versucht also die Anweisung im try-Block auszuführen und kommt es zu einem Fehler, kann die Ausnahme in einem sogenannten catch-Block aufgefangen (engl. catch) werden.
So sieht ein simpler try-catch-Block aus:
Der Ausnahmetyp im catch-Block gibt an, welche Art von Exception abgefangen wird. Der Typ kann der angegebene Typ oder spezieller sein.
Man kann meherer catch-Blöcke hintereinander haben und einen sogenannten. Finally-Block.
Kommt es zu KEINER Ausnahme im try-Block, wird dann der finally-Block (falls vorhanden) ausgeführt und dann der Rest der Methode.
Kommt es zu einer Ausnahme UND es gibt einen catch-Block, wird die entsprechende Ausnahme geworfen und der dazu passende catch-Block ausgeführt. Danach noch der finally-Block und dann wird die Methode hinter der try-Anweisung fortgesetzt.
Kommt es zu einer Ausnahme OHNE einen catch-Block, versagt die Methode. Es wird zunächst der finally-Block ausgeführt und dann wird die Ausnahme, die zum Versagen der Methode geführt hat an den Aufrufer weitergeleitet. Dort kann sie behandelt oder wiederum weitergeworfen werden.
Objekte der Klasse Error representieren Ausnahmen, die in der Regel nicht sinnvoll behandelt werden können und sollten während der Programmführung nicht auftreten.
Objekte der Klasse RuntimeException (und ihrer Unterklassen) repräsentieren Ausnahmen, die in der Regel auf Programmierfehler zurückzuführen sind.
Beispiel für einen throw im Konstruktor
Kommt es zur einer Ausnahme, wird der erste catch-Block ausgeführt, der zur Ausnahme passt.
In einer try-Anweisung müssen deshalb die Exception Handler für die am meisten spezialisierten Ausnahmeklassen „oben“ stehen.
Der Unterschied zwischen einer checked und einer unchecked Exception ist:
Bei einer checked Exception wird einem schon beim programmieren angezeigt, wenn es zu einer Exception kommen kann, man sich aber nicht um diese gekümmert hat.
Aufgrund einer möglichen FileNotFOundException wie im Bild wird man also dazu gezwungen einen try-catch-Block zu preogrammieren.
Man kann die Exception auch weiterwerfen, indem man z.B. das schreibt:
public static void lies(String dateiname) throws FileNotFoundException {
FileReader reader = new FIleReader(dateiname);
}
Jetzt braucht man in der Method keinen try-catch-Block, aber man muss sich dennoch darum kümmern.
Das macht man danneventuell dort, wo man die Methode oben aufruft. Also irgendwo muss z.B. stehen:
public static void main(String[] args) {
try {
abc.lies(dateiname);
} catch{
System.out.println(“FEHLER”);
Man gibt/wirft die Exception also weiter nach “oben”. Man sagt java damit nur, dass man weiß hier wird eine Ausnahme geschmissen, aber man kümmert sich woanders drum.
Es MUSS sich also früher oder später um eine checked Exception gekümmert werden!
Das hier wäre eine unchecked Exception. Es würde zu einer NullPointerException führen.
Hier würde Java vorm dem kompilieren nichts sagen, sondern erst beim kompilieren.
Man muss sich nicht um diese Exception kümmern, man sollte es aber mit einem try-catch-Block, sonst beendet sich das Programm.
Die roten Vierecke sind unchecked Exceptions, die blauen checked Exceptions.
Eine Unterklasse von Exception ist, wie man sieht, die RuntimeException. Und alle Unterklasen davon sind unchecked Exceptions.
Und hier in einem richitigen Beispiel:
Last changed2 years ago