1. Ausnahmen
>
Endlich dachten Programmierer darüber nach, die Fehlerbehandlung zu standardisieren und zu automatisieren. Dies geschah, als Ausnahmen erfunden wurden. Mittlerweile behandelt der Ausnahmemechanismus 80 % der Ausnahmesituationen.
Wenn sich ein Wissenschaftler Ausnahmen einfallen ließ, handelte es sich wahrscheinlich um das Thema seiner Doktorarbeit. Wenn ein Programmierer darauf gekommen ist, dann hat ihm vielleicht ein Kollege freundlich auf die Schulter geklopft: „Scheint okay, Bruder.“
Wenn in einem Java-Programm ein Fehler auftritt, beispielsweise eine Division durch 0
, passieren einige wunderbare Dinge:
Schritt eins
Es wird ein spezielles Ausnahmeobjekt erstellt, das Informationen über den aufgetretenen Fehler enthält.
Alles in Java ist ein Objekt, und Ausnahmen sind keine Ausnahmen 🙂 Ausnahmeobjekte haben ihre eigenen Klassen, und das einzige, was sie von gewöhnlichen Klassen unterscheidet, ist, dass sie die Throwable
Klasse erben.
Schritt zwei
Das Ausnahmeobjekt wird „geworfen“. Vielleicht könnte die Formulierung hier besser sein. „Eine Ausnahme auslösen“ ähnelt eher dem Auslösen eines Feueralarms oder dem Ertönen eines „DEFCON 1“-Alarms.
Wenn eine Ausnahme an die Java-Maschine geworfen wird, wird der normale Betrieb des Programms gestoppt und „Notfallprotokolle“ beginnen.
Schritt drei
Die Methode, in der die Ausnahme ausgelöst wurde, wird sofort beendet. Die Ausnahme wird an die aufrufende Methode übergeben, die ebenfalls sofort beendet wird. Und so weiter in der Kette, bis die main
Methode beendet wird. Wenn die main
Methode beendet wird, endet auch das Programm.
Beispiel:
Code | Konsolenausgabe |
---|---|
|
|
In Zeile 20 tritt eine Ausnahme auf: Division durch 0. Die Java-Maschine erstellt sofort eine Ausnahme – ein ArithmeticException
Objekt und „wirft“ es an die Methode.
Die divide()
Methode endet sofort, sodass wir nie die Zeichenfolge sehen: Es ist nichts Schlimmes passiert: 0. Das Programm kehrt zur endTheWorld()
Methode zurück und die Situation wiederholt sich: Es gibt eine nicht behandelte Ausnahme im System, was bedeutet, dass die endTheWorld()
Methode ebenfalls abnormal beendet wird. Dann wird die main
Methode beendet und das Programm stoppt.
Welchen Zweck haben diese Ausnahmen? Nun, Sie können Ihren eigenen Code schreiben, um bestimmte Arten von Ausnahmen abzufangen, und Ihre eigene Logik schreiben, um Ausnahmesituationen zu bewältigen.
2. Ausnahmen abfangen:try-catch
Java verfügt über einen Mechanismus zum Abfangen von Ausnahmen, mit dem Sie diese abnormale Beendigung von Methoden stoppen können. Es sieht aus wie das:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Dieses Konstrukt wird als Block bezeichnet try-catch
.
Code, in dem Ausnahmen auftreten können, wird in geschweifte Klammern eingeschlossen, denen das Wort vorangestellt ist try
.
Nach den geschweiften Klammern steht das catch
Schlüsselwort und in Klammern die Deklaration einer Ausnahmevariablen . Darauf folgen geschweifte Klammern, die den Code umschließen, der ausgeführt werden soll, wenn eine Ausnahme des angegebenen Typs auftritt .
Wenn während der Ausführung des „ Primärcodes “ keine Ausnahmen ausgelöst werden, wird der Code im Catch-Block nicht ausgeführt. Wenn eine Ausnahme auftritt, wird dies der Fall sein (wenn der Typ der ausgelösten Ausnahme mit dem Typ der Variablen in Klammern übereinstimmt).
Beispiel:
Code | Konsolenausgabe |
---|---|
|
|
3. Mehrere catch
Blöcke
Theoretisch können in einem Codeblock alle möglichen Ausnahmen ausgelöst werden. Einige werden Sie auf die eine Art und Weise angehen wollen, andere auf eine andere Art und wieder andere werden Sie beschließen, überhaupt nicht damit umzugehen.
Java-Entwickler haben beschlossen, Ihnen zu helfen und Sie nicht nur einen, sondern viele catch
Blöcke nach dem try
Block schreiben zu lassen.
try
{
// Code where an exception might occur
}
catch (ExceptionType1 name1)
{
// Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
// Code for handling ExceptionType2
}
catch (ExceptionType3 name3)
{
// Code for handling ExceptionType3
}
Beispiel:
Code | Konsolenausgabe |
---|---|
|
|
4. Reihenfolge der catch
Blöcke
Ausnahmen, die in einem try
Block auftreten, können nur von einem einzelnen Block abgefangen werden catch
. Es kann keine Ausnahmebehandlungssituation geben , in der der Code aus mehreren catch
Blöcken ausgeführt wird.
Aber die Reihenfolge der Blöcke ist wichtig.
Es kann vorkommen, dass eine Ausnahme von mehreren Blöcken abgefangen wird. Wenn dies der Fall ist, wird die Ausnahme von dem Catch- Block abgefangen, der zuerst kommt (der dem try
Block am nächsten liegt).
Wie kann es passieren, dass mehrere Catch-Blöcke dieselbe Ausnahme abfangen können?
Alle Ausnahmen gehören zu einer einzigen Vererbungshierarchie – siehe Diagramm.
Ein ArithmeticException
Objekt kann einer Variablen vom Typ ArithmeticException
oder einer ihrer Vorgängerklassen zugewiesen werden: RuntimeException
, Exception
und Throwable
– siehe Diagramm.
Wir werden in Level 21 mehr über Vererbung und Vorfahrenklassen sprechen.
Dieser Code lässt sich problemlos kompilieren:
Vorteile einer Vererbung: |
---|
|
Sie können also einen ArithmeticException
mit jedem der 4 catch
oben genannten Blöcke erreichen.
Beispiel 1:
Code | Konsolenausgabe |
---|---|
|
|
In diesem Beispiel kann das sowohl von den Blöcken als auch ArithmeticException
abgefangen werden . Es wird von dem Block abgefangen, der dem Block am nächsten ist – dem ersten Block.catch (Exception e)
catch (ArithmeticException e)
try
catch
Um Überraschungen zu vermeiden, ist es am besten, catch
Blöcke, die nahezu jede Ausnahme abfangen können, am Ende der Blockliste zu platzieren catch
.
Der Throwable
Typ ist im Allgemeinen in der Lage, jede mögliche Ausnahme in Java abzufangen . Wenn Sie es in den ersten catch
Block einfügen, wird der Code nicht kompiliert, da der Compiler weiß, dass es nicht erreichbare Codeblöcke gibt.
GO TO FULL VERSION