Ich folge dieser großartigen Diskussion bei SO mit dem Titel: Der Fall gegen geprüfte Ausnahmen , aber ich kann nicht nachvollziehen, wo genau RuntimeException verwendet werden sollte und wie sie sich von normalen Exceptions und ihren Unterklassen unterscheidet. Googeln gab mir eine komplexe Antwort, das heißt, es sollte verwendet werden, um Programmierlogikfehler zu behandeln, und sollte geworfen werden, wenn normalerweise keine Ausnahme auftreten sollte, wie beispielsweise im Standardblock des Schalterkonstrukts.
Können Sie die RuntimeException hier ausführlicher erklären? Danke.
Ich kann nicht genau folgen RuntimeException sollte verwendet werden
Das liegt wahrscheinlich daran, dass Sie ein Argument betrachten, d. h. die Leute sind sich über genau diesen Punkt nicht einig.
und wie ist es anders als normal Ausnahmen und ihre Unterklassen.
Ganz einfach: Alle Unterklassen von Exception
(außer RuntimeException
und ihre Unterklassen) sind geprüft , d. h. der Compiler wird den Code ablehnen, den Sie abfangen oder in der Methodensignatur deklarieren. Unterklassen von RuntimeException
sind jedoch deaktiviert .
Googeln gab mir eine komplexe Antwort, das heißt, es sollte verwendet werden, um zu handeln mit Programmierlogik Fehlern und sollte geworfen werden, wenn keine Ausnahme sollte normalerweise auftreten, wie in der Standardblock von Switch-Case konstruieren.
Dies ist die gängige Meinung, die besagt, dass Sie für alles, was ein Programm sinnvoll behandeln kann, checked exceptions verwenden sollten, weil dann der Compiler erzwingt , mit ihnen umzugehen. Umgekehrt können Programme in der Regel nicht sinnvoll mit Programmierfehlern umgehen und müssen daher nicht überprüft werden. So verwendet die Java-Standard-API RuntimeException
.
Die Diskussion, die Sie verlinkt haben, wird durch die Ansicht einiger Leute (einschließlich mir) ausgelöst, die glauben, dass überprüfte Ausnahmen zu falschem Code führen und daher nicht verwendet werden sollten. Da Sie die Ausnahmeprüfung im Compiler nicht deaktivieren können, können Sie nur nur RuntimeException
und seine Unterklassen verwenden.
Eine Beobachtung, dass diese Ansicht von IMO unterstützt wird, ist, dass die konventionelle Weisheit "unkontrollierte Ausnahmen nur für Programmiererfehler verwenden" in Wirklichkeit hauptsächlich eine Rationalisierung der Rückwärtslogik ist: Es gibt keinen Code-Sicherheitsgrund, warum der Compiler Sie nicht dazu zwingen sollte mit Programmierfehlern umgehen. Etwas wie NullPointerException
und ArrayIndexOutOfBoundsException
kann jedoch fast überall auftauchen, und wenn diese überprüft wurden, würde niemand jemals in Java programmieren wollen. Also mussten die Sprachdesigner eine, huh, Ausnahme für diese machen und sie unkontrolliert machen. Um dies zu erklären, haben sie die Geschichte "Ungeprüfte Ausnahmen sind für Programmiererfehler" entwickelt.
Zitate aus Effektive Java 2. Ausgabe, Punkt 58: Verwenden Sie geprüfte Ausnahmen für behebbare Bedingungen und Laufzeitausnahmen für Programmierfehler
Die Programmiersprache Java bietet drei Arten von throwables: geprüfte Ausnahmen , Laufzeitausnahmen und Fehler . Es gibt einige Verwirrung unter den Programmierern, wann es angemessen ist, jede Art von Throwable zu verwenden. Obwohl die Entscheidung nicht immer klar ist, gibt es einige allgemeine Regeln, die eine starke Orientierung bieten.
Die Hauptregel bei der Entscheidung, ob eine geprüfte Ausnahme oder eine ungeprüfte Ausnahme verwendet werden soll, lautet wie folgt:
- Verwenden Sie geprüfte Ausnahmen für Bedingungen, von denen der Aufrufer vernünftigerweise erwarten kann, dass er wiederhergestellt wird. Durch das Übergeben einer aktivierten Ausnahme erzwingen Sie, dass der Aufrufer die Ausnahme in einer
catch
-Klausel behandelt oder sie nach außen weitergibt. Jede geprüfte Ausnahme, für die eine Methode deklariert wird, ist daher eine starke Angabe für den API-Benutzer, dass die zugehörige Bedingung ein mögliches Ergebnis des Aufrufs der Methode ist.- Verwenden Sie Laufzeitausnahmen, um auf Programmierfehler hinzuweisen . Die große Mehrheit der Laufzeitausnahmen gibt Vorbedingungsverletzungen an. Ein Vorbedingungsverstoß ist einfach ein Fehler des Clients einer API, den Vertrag einzuhalten, der in der API-Spezifikation angegeben ist.
Hier ist ein Beispiel:
FileNotFoundException
eine geprüfte Ausnahme. null
als Dateinamen angeben, NullPointerException
(oder vielleicht eine IllegalArgumentException
- eine andere strittige Debatte) sollte geworfen werden. Der Client der API soll einen gültigen String-Wert liefern; null
ist nicht. Soweit es die API betrifft, ist dies ein Programmierfehler, der leicht vermeidbar war. Bei beiden Ausnahmen handelt es sich um Laufzeitausnahmen. Punkt 59: Vermeiden Sie unnötige Verwendung von geprüften Ausnahmen bietet auch zusätzliche Anleitung:
Überprüfte Ausnahmen sind eine wunderbare Eigenschaft der Programmiersprache Java. Im Gegensatz zu Return-Codes zwingen sie den Programmierer, sich mit außergewöhnlichen Bedingungen zu befassen, was die Zuverlässigkeit erheblich verbessert. Das heißt, eine übermäßige Verwendung von überprüften Ausnahmen kann die Verwendung einer API viel weniger angenehm machen. Wenn eine Methode eine oder mehrere überprüfte Ausnahmen auslöst, muss der Code, der die Methode aufruft, die Ausnahmen in einem oder mehreren
catch
-Blöcken behandeln, oder sie mussthrows
die Ausnahmen deklarieren und sie nach außen verbreiten lassen. Wie auch immer, es stellt eine nicht-triviale Belastung für den Programmierer dar.Die Belastung ist gerechtfertigt, wenn:
- Die Ausnahmebedingung kann nicht durch die richtige Verwendung der API, und , verhindert werden
- Der Programmierer, der die API verwendet, kann einige nützliche Maßnahmen ergreifen, sobald er mit der Ausnahme konfrontiert wird.
Wenn diese beiden Bedingungen nicht erfüllt sind, ist eine unkontrollierte Ausnahme geeigneter.
Hier also eine kurze Zusammenfassung der Empfehlung von Effective Java 2nd Edition :
Eine ungeprüfte Ausnahme ist definiert als RuntimeException
und seine Unterklassen und Error
und seine Unterklassen. Sie müssen nicht in der throws
-Klausel einer Methode deklariert werden.
Tags und Links java exception runtimeexception