Hier ist ein Beispiel, das das gegensätzliche Verhalten der Java Klasse 'Exception' zeigt.
%Vor%Wenn der überprüfte Ausnahmetyp einen catch-Block enthält, ohne dass ein Fehler zu dieser bestimmten checked exception im try-Block führt, dann wird der Compiler einen Fehler wie "Diese Ausnahme wird niemals aus dem try-Statement-Body geworfen" auslösen. . Aber im obigen Fall gibt der Compiler keinen Fehler.
Wenn andererseits eine Ausnahme vom Typ Exception-Klasse ausgelöst wird, indem das Schlüsselwort throw verwendet wird, wird die Exception nicht wie in
zu einem Aufrufer duckt %Vor%Im obigen Fall gibt der Compiler den Fehler "Unhandled Exception Type Exception".
Also, ist Java Exception-Klasse aktiviert oder deaktiviert?
Danke Raj.
Exception
ist eine geprüfte Ausnahme. Von Abschnitt 11.2 der JLS :
Die nicht aktivierten Ausnahmeklassen sind die Klasse RuntimeException und ihre Unterklassen sowie die Klasse Error und seine Unterklassen. Alle anderen Ausnahmeklassen sind geprüfte Ausnahmeklassen.
Allerdings ist das Verhalten, das Sie sehen, in der Lage, es zu fangen, ohne etwas in dem try-Block, der erklärt wird, etwas zu werfen, wegen Abschnitt 14.20 der JLS :
Es ist ein Fehler bei der Kompilierung, wenn eine catch-Klausel den überprüften Ausnahmetyp E1 abfängt, aber es gibt keinen überprüften Ausnahmetyp E2, so dass alle folgenden Punkte gelten:
- E2 & lt ;: E1
- Der try-Block, der der catch-Klausel entspricht, kann E2
ausgeben- Kein vorangehender catch-Block der unmittelbar umschließenden try-Anweisung fängt E2 oder einen Supertyp von E2 ab.
außer E1 ist die Klasse Exception.
Der Grund dafür ist RuntimeException
, was eine nicht kontrollierte Ausnahme Unterklasse von Exception
ist. Im Gegensatz zu allen anderen überprüften Ausnahmen ist es für catch (Exception)
möglich, eine ungeprüfte Ausnahme abzufangen, die (in einem vereinfachten Modell) möglicherweise von any try
-Block ausgelöst wird. Im Grunde vermischt sich RuntimeException
mit der Ausnahmehierarchie: (
RuntimeException, Error und ihre Unterklassen sind nicht markierte Ausnahmen. Rest alle inklusive Super-Klassen werden überprüft. Natürlich kann als überprüfte Ausnahme die Unterklasse von Exception sein, sie muss selbst überprüft werden.
Was Sie über Ausnahmen wissen sollten:
Exceptions
sind geprüft , dh wenn sie als throws
deklariert sind, müssen sie behandelt (gefangen) werden. Grob sind diese für "Nicht-Programmierfehler". zB IOException
RuntimeExceptions
(eine Unterklasse von Exception
) sind nicht markiert , was bedeutet, dass sie nicht behandelt werden müssen, wenn sie deklariert sind, und sie können ausgelöst werden, wenn sie nicht deklariert werden. Grob sind diese für "Programmierfehler". zB NullPointerException
Errors
sind deaktiviert, aber nicht Exceptions
(siehe unten). Diese sind für "nicht behebbare" Fehler. zB OutOfMemoryError
Throwable
ist die abstrakte Elternklasse aller oben genannten Versuchen Sie Folgendes:
%Vor%oder wenn Sie sowohl Laufzeit- als auch Nicht-Laufzeit-Ausnahmen erwarten:
%Vor% Jon Skeet war in der Nähe, hat es aber nicht genau verstanden ... Er hat die throw
Aussage nicht erklärt. Ihre Antwort dazu finden Sie im Abschnitt 14.18 - The throw
Statement der Java-Sprachspezifikation, insbesondere:
Der Ausdruck in einer throw-Anweisung muss eine Variable oder einen Wert von angeben ein Referenztyp, der dem Typ Throwable, oder zuweisbar ist (§5.2) Ein Fehler bei der Kompilierung tritt auf. Darüber hinaus mindestens eines der folgenden Drei Bedingungen müssen wahr sein oder ein Fehler bei der Kompilierung tritt auf:
- Die Ausnahme ist keine geprüfte Ausnahme (§11.2) - insbesondere eine von die folgenden Situationen sind wahr:
- Der Typ des Ausdrucks ist der Klasse RuntimeException oder eine Unterklasse von RuntimeException.
- Der Typ von Der Ausdruck ist die Klasse Error oder eine Unterklasse von Error.
- Der Wurf Anweisung ist im try-Block einer try-Anweisung enthalten (§14.20) und der Typ des Ausdrucks ist dem Typ des Attributs zuweisbar (§5.2) Parameter von mindestens einer catch-Klausel der try-Anweisung. (In diesem Fall wir sagen, der geworfene Wert wird von der try-Anweisung abgefangen.)
- Der Die throw-Anweisung ist in einer Methode oder Konstruktordeklaration enthalten und der Typ des Ausdrucks ist mindestens eins zuzuweisen (§5.2) Typ, der in der throws-Klausel (§8.4.6, §8.8.5) der Deklaration aufgeführt ist.
Sie werfen ein Exception
, was kein RuntimeException
oder eine Teilmenge von RuntimeException
ist. Keine der anderen Bedingungen gilt auch.
Um dies zu überprüfen, werfen Sie einen new RuntimeException()
und sehen Sie, ob der Compiler sich beschwert.
Geprüfte Ausnahme Die Ausnahme, die vom Java-Compiler zur reibungslosen Ausführung des Programms zur Laufzeit überprüft wird, heißt Checked Exception.
Vollständig markierte Ausnahme Die ausgewählte Ausnahme wird nur dann vollständig geprüft, wenn alle untergeordneten Klassen überprüft wurden. IOException, InterruptedException etc.
Teilweise überprüfte Ausnahme Eine markierte Ausnahme wird nur dann teilweise überprüft, wenn einige ihrer untergeordneten Klassen deaktiviert sind. In der gesamten Ausnahmehierarchie sind die nur teilweise geprüften Ausnahmen Ausnahme und Throwable
Ungeprüfte Ausnahme Die Ausnahme, die nicht vom Java-Compiler ausgelöst wird, ob die Ausnahme ausgelöst wird oder nicht, heißt Unchecked Exception.
Hinweis: Ausnahmeklasse ist weder aktiviert noch deaktiviert. Es ist eine teilweise geprüfte Ausnahme.
Tags und Links java