web-dev-qa-db-de.com

können nicht ungeprüfte Java-Ausnahmen mit dem try/catch-Block behandelt werden?

In einem Tutorial habe ich festgestellt, dass Uncheckeded Exception nicht mit Ihrem Code behandelt werden kann, d. H. Wir können try/catch-Block nicht verwenden. Die Beispiele sind Ausnahmen wie ArrayIndexOutOfBoundsException, NullPointerException.. Diese Exceptions können jedoch mit try/catch-Block behandelt werden. Ich denke, mir ist das Konzept nicht klar !! 

Außerdem denke ich, dass das throw-Schlüsselwort nur mit try/catch block.can throw verwendet werden kann. Das Schlüsselwort wird mit UncheckedException verwendet.

20
Aravindh an

Der einzige Unterschied zwischen geprüften und ungeprüften Ausnahmen besteht darin, dass markierte have entweder in der Methodensignatur mit throws abgefangen oder deklariert werden, während dies bei ungeprüften nicht optional ist.

Ungeprüfte Ausnahmen können von Ihrem Code nicht behandelt werden, d. H. Wir können den try/catch-Block nicht verwenden

Sicher können wir - aber wir müssen nicht.

Außerdem denke ich, dass das throw-Schlüsselwort nur mit try/catch block verwendet werden kann.

Beachten Sie, dass es zwei Schlüsselwörter gibt:

  • throw löst explizit ein von Ihnen erstelltes Exception-Objekt aus. throw new NullPointerException(); funktioniert einwandfrei, auch wenn das explizite Erstellen einer bestimmten Ausnahme ungewöhnlich ist und von den meisten als schlecht empfunden wird.
  • throws erklärt, dass eine Methode diese Ausnahme auslösen kann. Mit ungeprüften Ausnahmen ist dies optional, kann jedoch hilfreich sein, um die Tatsache zu dokumentieren (wiederum würde man normalerweise nicht throws NullPointerException deklarieren, da dies ziemlich gegeben ist).
32

Alle ungeprüften Ausnahmen können auf dieselbe Weise wie die markierten behandelt werden. Wenn Sie möchten, können Sie sie passieren lassen, indem Sie die Methode throws angeben:

public void m() throws RuntimeException {}

Oder Sie können catch sie:

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

Es sollte beachtet werden, dass die Klasse RuntimeException für alle ungeprüften Ausnahmen als Catch-All fungiert (da alle ungeprüften Ausnahmen von ihr ausgehen), und zwar auf die gleiche Weise, dass die Klasse Exception für alle geprüften Ausnahmen das All-Catch ist.

Wie bereits erwähnt, besteht der einzige wirkliche Unterschied darin, dass Sie mit {have befassen werden (indem Sie sie passieren lassen oder fangen), und der Compiler sichert es ab - auf der anderen Seite Die Behandlung ungeprüfter Ausnahmen ist optional.

Es hängt alles von der erwarteten Verwendung jedes Ausnahmetyps ab - Sie können sich von überprüften Ausnahmen erholen (oder zumindest etwas dagegen tun, wenn sie auftreten), während es für ungeprüfte Ausnahmen nicht sinnvoll ist Weg, um sich von ihnen zu erholen. Dies ist natürlich etwas subjektiv.

6
Óscar López

Sie werden can behandelt, aber Sie müssen nicht müssen. Wenn Sie nicht mit ihnen umgehen, werden sie den Stack der aufrufenden Methoden weiter verbreiten und aufsteigen, bis einer von ihnen ihn fängt. Wenn dies nicht der Fall ist, stürzt das Programm ab.

In der Regel lautet das Fazit: Wenn von einem Client vernünftigerweise erwartet wird, dass er sich von einer Ausnahme erholt, sollte es sich um eine geprüfte Ausnahme handeln. Wenn ein Client aus der Ausnahme nichts erholen kann, ist es in Ordnung, dass er als ungeprüfte Ausnahme vorhanden ist.

geprüfte Ausnahmen sind nützlich, um eine API zu dokumentieren, von der Sie erwarten, dass sie von Drittanbietern verwendet wird. Wenn sie wissen, dass Ihre Methode eine bestimmte Ausnahme auslösen kann, werden sie entsprechend codiert und den Fall behandeln. Wenn Sie nur ungeprüfte Ausnahmen verwenden, sind alle Wetten deaktiviert.

Ein allgemeines Muster (einige Leute mögen es nicht, aber in manchen Fällen ist es in Ordnung, wenn Sie wissen, was Sie tun), geworfene Ausnahmen in ungeprüfte Ausnahmen zu packen.

try {
   ... code that can throw CheckedException ...
} catch (CheckedException oopsSomethingBadHappened) {
    throw new RuntimeException("Something bad happened!", oopsSomethingBadHappened);
}
5
Guillaume

Neben Guillaume: 

  • ungeprüfte Ausnahmen sind in der Regel Programmierfehler, die bei korrekter Implementierung (Index außerhalb des gebundenen Bereichs, Nullzeiger, Klassenumwandlung, ...) überhaupt nicht vorkommen dürfen. Daher kann der Aufrufer/Benutzer normalerweise nichts dagegen unternehmen.
  • geprüfte Ausnahmen werden ausgelöst, da sie außerhalb der Kontrolle des Programmierers waren (Netzwerk nicht verfügbar, Dateisystem nicht verfügbar, gleichzeitige Änderungen wie duplizierter Primärschlüssel, ...)
  • fehler werden in der Regel von der JVM ausgelöst und die Anwendung muss normalerweise gestoppt werden (Speicherplatz, Stapelüberlauf, ...)
3
Puce

Eine einfache Möglichkeit, über den Unterschied nachzudenken, besteht darin zu denken, dass die Überprüfung sich auf das Kompilieren bezieht. Wenn es sich bei einer Ausnahme um eine geprüfte Ausnahme handelt, prüft der Compiler, ob der Code die Ausnahme auslöst oder in einem try/catch-Block zur Kompilierzeit behandelt wird. Bei ungeprüften Ausnahmen führt der Compiler keine solche Prüfung durch. Sie können gecheckte/ungeprüfte Ausnahmen auf dieselbe Weise behandeln (mit try/catch/throw), der Unterschied liegt nur in den Prüfungen, die der Compiler durchführt. Dieser Beitrag hat ein anständiges Beispiel

3
Chris

Ja, Sie können die ungeprüfte Ausnahme behandeln, sind jedoch nicht obligatorisch. Tatsächlich hängt es vom Anwendungsentwickler ab. Unten ist der mögliche Grund, wo ich denke, erforderlich, um auch ungeprüfte Ausnahme zu behandeln.

  • Wenn Ihre Anwendung groß ist und sich viele Entwickler gegenseitig eine API aufrufen. Es ist besser, die ungeprüfte Ausnahme zu behandeln, sonst stürzt Ihr Programm am Ende ab, wodurch die anderen Funktionen gestoppt werden. So kann auch die einfache NullPointerException Ihr Programm zum Stillstand bringen.

  • Stellen Sie sich vor, Sie haben einen Scheduler, der die Benutzerdaten verarbeitet und in Millionengröße vorliegt, und für die fehlerhaften Daten möchten Sie nur das Protokoll drucken, um nicht aufhören zu können, für andere gute Daten zu arbeiten. In diesem Fall können fehlerhafte Daten Ihr Programm stoppen, wenn Sie die Ausnahme nicht behandelt haben

0
CrazyCoder

Ja, mit throw können Sie ungeprüfte Ausnahmen auslösen. Und ja, Sie können ungeprüfte Ausnahmen in einem catch-Block abfangen.

0
tobiasbayer