1) // Klasse, die eine vom Gebrauch definierte Ausnahmeklasse darstellt MyException erweitert Exception {public MyException (String s) {super (s); }} -------------------------------------------- 2) try {// Objekt einer benutzerdefinierten Ausnahme auslösen throw new MyException ("TestException"); } catch (MyException ex) {System.out.println ("Gefangen"); // Die Nachricht vom MyException-Objekt drucken System.out.println (ex.getMessage ()); }
Mandeep Yadav
Antworten:
285
Um eine aktivierte Ausnahme zu definieren , erstellen Sie eine Unterklasse (oder eine Hierarchie von Unterklassen) von java.lang.Exception. Beispielsweise:
... und Code, der diese Methode aufruft, muss diese Ausnahme (oder beides) entweder behandeln oder weitergeben:
try{int i =5;
myObject.calculate(5);}catch(FooException ex){// Print error and terminate application.
ex.printStackTrace();System.exit(1);}catch(IOException ex){// Rethrow as FooException.thrownewFooException(ex);}
Sie werden im obigen Beispiel feststellen, dass IOExceptionals gefangen und erneut geworfen wird FooException. Dies ist eine gängige Technik zum Einkapseln von Ausnahmen (normalerweise beim Implementieren einer API).
Manchmal gibt es Situationen, in denen Sie nicht jede Methode zwingen möchten, Ihre Ausnahmeimplementierung in ihrer throw-Klausel zu deklarieren. In diesem Fall können Sie eine ungeprüfte Ausnahme erstellen . Eine nicht aktivierte Ausnahme ist eine Ausnahme, die erweitert wird java.lang.RuntimeException(die selbst eine Unterklasse von ist java.lang.Exception):
Nicht aktivierte Ausnahmen werden normalerweise verwendet, um einen Programmiererfehler zu kennzeichnen, z. B. das Übergeben eines ungültigen Arguments an eine Methode oder den Versuch, die Grenzen eines Array-Index zu überschreiten.
Die java.lang.ThrowableKlasse ist die Wurzel aller Fehler und Ausnahmen, die in Java ausgelöst werden können. java.lang.Exceptionund java.lang.Errorsind beide Unterklassen von Throwable. Alles, was Unterklassen sind, Throwablekann geworfen oder gefangen werden. Es ist jedoch in der Regel eine schlechte Praxis, zu fangen oder zu werfen, Errorda dies verwendet wird, um Fehler innerhalb der JVM zu kennzeichnen, die normalerweise vom Programmierer nicht "behandelt" werden können (z OutOfMemoryError. B. ). Ebenso sollten Sie das Fangen vermeiden Throwable, da dies dazu führen kann, dass Sie Errorzusätzlich zu Exceptions auch s fangen .
Technisch gesehen kann alles, was erweitert wird Throwable, ausgelöst werden, aber Ausnahmen sind im Allgemeinen Erweiterungen der ExceptionKlasse, sodass sie geprüfte Ausnahmen sind (mit Ausnahme von RuntimeException oder darauf basierenden Klassen, die nicht geprüft werden), im Gegensatz zu dem anderen gängigen Typ von throwable. Errors, die normalerweise nicht für einen ordnungsgemäßen Umgang mit JVM-Interna ausgelegt sind.
Sie können Ausnahmen auch nicht öffentlich machen, aber dann können Sie sie nur in dem Paket verwenden, das sie definiert, und nicht zwischen Paketen.
Was das Werfen / Abfangen von benutzerdefinierten Ausnahmen betrifft, funktioniert es genauso wie die integrierten - werfen über
RuntimeException erweitert Exception und ist keine aktivierte Ausnahme.
Adamski
2
Technisch kann alles, was sich Throwableausdehnt, geworfen werden ; Ausnahmen verlängern Exception. Eine benutzerdefinierte Unterklasse von Throwable würde nicht von einem try { ... } catch (Exception e) { ... }Block erfasst .
Andrzej Doyle
Warum stimmen die Leute dieser Antwort zu? Es enthält einige Ungenauigkeiten. 1) Sie können Throwable nicht implementieren, da es sich um eine Schnittstelle handelt. 2) Alles , was sie Throwable ist nicht eine Ausnahme ( Errorist keine Ausnahme, es ist ein Fehler). 3) Dies bedeutet, dass jede Unterklasse von Exception aktiviert ist, RuntimeException jedoch nicht. Die Antwort von Adamski ist viel genauer!
oxbow_lakes
Ups - ich meinte, Wurf ist natürlich keine Schnittstelle!
oxbow_lakes
@oxbow_lakes - die ideale Lösung wäre, die Ungenauigkeiten zu beheben, nicht wahr? Jedenfalls habe ich sie selbst korrigiert, da es sonst niemand getan hat.
Antworten:
Um eine aktivierte Ausnahme zu definieren , erstellen Sie eine Unterklasse (oder eine Hierarchie von Unterklassen) von
java.lang.Exception
. Beispielsweise:Methoden, die diese Ausnahme möglicherweise auslösen oder verbreiten können, müssen sie deklarieren:
... und Code, der diese Methode aufruft, muss diese Ausnahme (oder beides) entweder behandeln oder weitergeben:
Sie werden im obigen Beispiel feststellen, dass
IOException
als gefangen und erneut geworfen wirdFooException
. Dies ist eine gängige Technik zum Einkapseln von Ausnahmen (normalerweise beim Implementieren einer API).Manchmal gibt es Situationen, in denen Sie nicht jede Methode zwingen möchten, Ihre Ausnahmeimplementierung in ihrer throw-Klausel zu deklarieren. In diesem Fall können Sie eine ungeprüfte Ausnahme erstellen . Eine nicht aktivierte Ausnahme ist eine Ausnahme, die erweitert wird
java.lang.RuntimeException
(die selbst eine Unterklasse von istjava.lang.Exception
):Methoden können
FooRuntimeException
Ausnahmen auslösen oder verbreiten, ohne sie zu deklarieren. z.BNicht aktivierte Ausnahmen werden normalerweise verwendet, um einen Programmiererfehler zu kennzeichnen, z. B. das Übergeben eines ungültigen Arguments an eine Methode oder den Versuch, die Grenzen eines Array-Index zu überschreiten.
Die
java.lang.Throwable
Klasse ist die Wurzel aller Fehler und Ausnahmen, die in Java ausgelöst werden können.java.lang.Exception
undjava.lang.Error
sind beide Unterklassen vonThrowable
. Alles, was Unterklassen sind,Throwable
kann geworfen oder gefangen werden. Es ist jedoch in der Regel eine schlechte Praxis, zu fangen oder zu werfen,Error
da dies verwendet wird, um Fehler innerhalb der JVM zu kennzeichnen, die normalerweise vom Programmierer nicht "behandelt" werden können (zOutOfMemoryError
. B. ). Ebenso sollten Sie das Fangen vermeidenThrowable
, da dies dazu führen kann, dass SieError
zusätzlich zuException
s auch s fangen .quelle
Wirf es als:
Fang als:
quelle
Für eine aktivierte Ausnahme:
Technisch gesehen kann alles, was erweitert wird
Throwable
, ausgelöst werden, aber Ausnahmen sind im Allgemeinen Erweiterungen derException
Klasse, sodass sie geprüfte Ausnahmen sind (mit Ausnahme von RuntimeException oder darauf basierenden Klassen, die nicht geprüft werden), im Gegensatz zu dem anderen gängigen Typ von throwable.Error
s, die normalerweise nicht für einen ordnungsgemäßen Umgang mit JVM-Interna ausgelegt sind.Sie können Ausnahmen auch nicht öffentlich machen, aber dann können Sie sie nur in dem Paket verwenden, das sie definiert, und nicht zwischen Paketen.
Was das Werfen / Abfangen von benutzerdefinierten Ausnahmen betrifft, funktioniert es genauso wie die integrierten - werfen über
und fangen über
quelle
Throwable
ausdehnt, geworfen werden ; Ausnahmen verlängernException
. Eine benutzerdefinierte Unterklasse von Throwable würde nicht von einemtry { ... } catch (Exception e) { ... }
Block erfasst .Error
ist keine Ausnahme, es ist ein Fehler). 3) Dies bedeutet, dass jede Unterklasse von Exception aktiviert ist, RuntimeException jedoch nicht. Die Antwort von Adamski ist viel genauer!