Ausgabe
Beim Lesen über Ausnahmen werde ich immer auf geprüfte Ausnahmen und ungeprüfte Ausnahmen stoßen. Wollten Sie also wissen, wie man unterscheidet, was was ist?
Bearbeiten: Ich möchte wissen, ob ich eine Ausnahmeklasse erstelle, wie kann ich dann als aktiviert oder als deaktiviert erstellen?
und was ist die Bedeutung von jedem?
Lösung
Alle Throwable
s außer Unterklassen von java.lang.RuntimeException
oder java.lang.Error
werden geprüft. Genau genommen sind in Java “Ausnahmen” Unterklassen von java.lang.Exception
, “Fehler” sind Unterklassen von java.lang.Error
und java.lang.Throwable
werden normalerweise nicht direkt als Unterklassen bezeichnet.
Programme sollen keine eigenen Error
Unterklassen erstellen (obwohl die Dokumentation dazu ziemlich zweideutig ist), also erstellen Sie im Allgemeinen immer Exceptions
, indem Sie a verwenden, RuntimeException
wenn Sie nicht möchten, dass es überprüft wird.
Um zur Laufzeit zu wissen, ob Sie eine geprüfte Ausnahme haben, können Sie Folgendes verwenden:
if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
// this is a checked Exception
}
Eine geprüfte Ausnahme muss entweder in einer catch-Klausel behandelt oder in der Methodensignatur als ausgelöst deklariert werden. der Compiler erzwingt dies. Im Allgemeinen verwendet man geprüfte Ausnahmen für Ausnahmen, die vom aufrufenden Code behandelt werden sollen, während ungeprüfte Ausnahmen für Bedingungen gelten, die das Ergebnis eines Programmierfehlers sind und durch Korrektur des Codes behoben werden sollten.
Allerdings gibt es in der Java-Community viele Debatten über die Wirksamkeit der Verwendung von geprüften Ausnahmen im Vergleich zu ungeprüften Ausnahmen überall – ein Thema, das in dieser Antwort viel zu tief diskutiert werden kann.
BEARBEITEN 2012-10-23: Als Antwort auf Kommentare (die ziemlich gültig sind), um zu verdeutlichen, wäre Folgendes erforderlich, um festzustellen, ob ein Capture Throwable
ein Häkchen Throwable
im Gegensatz zu einem Häkchen ist Exception
:
if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
// this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
}
Wenn bekannt ist, dass das fragliche Objekt eine Instanz von Throwable
ist (z. B. wenn es gefangen wurde), wird nur der zweite Teil des obigen „if“ benötigt (z. B. ist das Testen auf Throwable überflüssig).
Beantwortet von – Lawrence Dol
Antwort geprüft von – Candace Johnson (FixError Volunteer)