Bitte erklären Sie RuntimeException in Java und wo es verwendet werden sollte

8

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.

    
euphoria83 22.08.2010, 07:46
quelle

2 Antworten

17
  

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.

    
Michael Borgwardt 22.08.2010, 08:20
quelle
15

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:

  • Beim Versuch, eine Datei mit einem beliebigen Namen zu lesen, ist die Datei möglicherweise nicht vorhanden. Es ist nicht unbedingt ein Programmierfehler, wenn eine Datei nicht existiert (z. B. vielleicht vorher, aber dann versehentlich gelöscht wurde). Clients möchten möglicherweise davon erholen. Daher ist FileNotFoundException eine geprüfte Ausnahme.
  • Wenn Sie eine Zeichenfolge 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 muss throws 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 :

  • Vermeidbare Ausnahmen, die aufgrund von API-Benutzerfehlern auftreten, sollten deaktiviert sein .
  • Ausnahmen, die nicht vernünftig behandelt werden können, sollten auch deaktiviert sein .
  • Andernfalls sollte die Ausnahme aktiviert sein .

Siehe auch

  • Effektive Java 2nd Edition
    • Option 58: Verwenden Sie überprüfte Ausnahmen für wiederherstellbare Bedingungen und Laufzeitausnahmen für Programmierfehler
    • Punkt 59: Vermeiden Sie die unnötige Verwendung von geprüften Ausnahmen
    • Punkt 60: Befürworten Sie die Verwendung von Standardausnahmen
    • Punkt 61: Ausnahmen für die Abstraktion auslösen
    • Punkt 62: Dokumentiere alle Ausnahmen, die von jeder Methode ausgelöst werden

Technische Definition

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.

Referenzen

Verwandte Fragen

polygenelubricants 22.08.2010 08:19
quelle