Sollten Methoden, die RuntimeException auslösen, dies in der Methodensignatur angeben?


86

Beispielsweise können viele Methoden in Frameworks / JDK ausgelöst werden

java.lang.SecurityException 

Dies wird jedoch nicht in der Methodensignatur angegeben (da dies normalerweise für geprüfte Ausnahmen reserviert ist). Ich möchte argumentieren, dass das Deklarieren von RuntimeExceptions in Methodensigs viele Vorteile hat (ähnlich wie beispielsweise die statische Typprüfung). Bin ich betrunken oder anders?

Antworten:


69

Ich würde keine ungeprüfte Ausnahme in der Signatur deklarieren, da dies für den Benutzer dieser API irreführend ist. Es ist nicht mehr ersichtlich, ob die Ausnahme explizit behandelt werden muss.

Es im Javadoc zu deklarieren ist ein besserer Ansatz, da es jemandem ermöglicht, damit umzugehen, wenn er es für notwendig hält, aber zu wissen, dass er es ignorieren kann, wenn er möchte. Dies macht die Trennung zwischen aktiviert und deaktiviert deutlich.


4
Der Java-Compiler zwingt Sie nicht, deklarierte RuntimeExceptions zu verarbeiten. Sie können sie also als "Hinweis" für Entwickler deklarieren. Es ist umstritten, ob JavaDoc dafür ein besserer Ort ist. Der Punkt über aktivierte und nicht aktivierte Ausnahmen ist wichtig. Aktivierte und nicht aktivierte Ausnahmen sind das, was Java mit (Compiletime-) Exceptions (aktiviert) und RuntimeExceptions (nicht aktiviert) wirklich bedeutet.
Guardian667

5
Im Frühjahr war es üblich, ungeprüfte Ausnahmen bei der Methodensignatur zu erklären.
Nascar

38

Aus dem Oracle Java-Tutorial :

"Wenn es so gut ist, die API einer Methode zu dokumentieren, einschließlich der Ausnahmen, die sie auslösen kann, warum nicht auch Laufzeitausnahmen angeben?" Laufzeitausnahmen stellen Probleme dar, die das Ergebnis eines Programmierproblems sind, und daher kann nicht erwartet werden, dass der API-Clientcode von ihnen wiederhergestellt oder in irgendeiner Weise behandelt wird. Solche Probleme umfassen arithmetische Ausnahmen, wie das Teilen durch Null; Zeigerausnahmen, z. B. der Versuch, über eine Nullreferenz auf ein Objekt zuzugreifen; und Indizieren von Ausnahmen, z. B. der Versuch, über einen zu großen oder zu kleinen Index auf ein Array-Element zuzugreifen.

Laufzeitausnahmen können überall in einem Programm auftreten, und in einem typischen Programm können sie sehr zahlreich sein. Das Hinzufügen von Laufzeitausnahmen in jeder Methodendeklaration würde die Klarheit eines Programms verringern.


Daher erfordert der Compiler nicht, dass Sie Laufzeitausnahmen abfangen oder angeben (obwohl Sie dies können).
Nascar

18

Schauen Sie sich das Javadoc für Collection # add an

Es gibt eine ganze Reihe von ungeprüften Ausnahmen:

Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.

Wenn Sie die Geduld haben, würde ich empfehlen, die möglichen Ausnahmen, die Ihre Methoden auf diese Weise auslösen, gründlich zu dokumentieren. In gewisser Weise ist es sogar noch wichtiger, dies für ungeprüfte Ausnahmen zu tun, da geprüfte Ausnahmen sich selbst dokumentieren (der Compiler zwingt den aufrufenden Code, sie zu bestätigen).


6
Diese Antwort ist falsch. Sie sprechen über Javadoc-Anweisungen, während die Frage throwsin der Methodensignatur. Das ist nicht dasselbe. Ja, Sie sollten unbedingt alle von Ihrer API ausgelösten Ausnahmen dokumentieren, aber die Frage bezieht sich nicht darauf.
Gili

8

Aus meiner Sicht ist es besser, Laufzeitausnahmen zumindest im Javadoc für die Methode zu deklarieren. Wenn Sie es in der Signatur deklarieren, wird noch deutlicher, was passieren kann, wenn etwas schief geht. Dies ist mein Hauptgrund für den Vorschlag, diese Informationen bereitzustellen.

Zu Ihrer Information: Mit der Zeit (jetzt im Jahr 2017) neige ich jetzt viel mehr dazu, sie nur in Javadoc zu dokumentieren und überprüfte Ausnahmen so weit wie möglich zu vermeiden.


3

Meiner Ansicht nach sollten ungeprüfte Ausnahmen niemals in der Methodensignatur deklariert werden, da dies ihrer Natur widerspricht.

Wenn eine Methode jedoch wahrscheinlich einige ungeprüfte Ausnahmen auslöst, die die wahrscheinlichen Umstände in @throws in Javadoc notieren, kann dies für andere hilfreich sein, die die Methode aufrufen, um zu verstehen, was schief gehen kann. Dies ist jedoch nur für Ausnahmen nützlich, die die Anrufer wahrscheinlich verarbeiten können (z. B. eine NPE aufgrund schlechter Eingaben usw.).


3

Wenn Sie eine API zur Verwendung durch andere schreiben, gibt es genügend Gründe für eine explizite Dokumentation Ihrer Absicht in der API, und es gibt keinen Nachteil, RuntimeExceptions in der Methodensignatur zu deklarieren.


1

Dies hat mit der Diskussion über geprüfte Ausnahmen zu tun . Die meisten würden zustimmen, dass Ausnahmen nicht in Methodensignaturen deklariert werden sollten.

Es gibt auch eine Diskussion darüber, wie Laufzeitausnahmen verwendet werden sollten. Ich stimme einem Poster zu, dass Laufzeitausnahmen einen Programmierfehler oder einen schwerwiegenden Zustand anzeigen sollten. Es gibt also nicht viel Verdienst, sie in der Unterschrift zu deklarieren. Jede Methode könnte möglicherweise durch eine.


Wo passt dann eine Parsing-Ausnahme oder eine andere Ausnahme vom Typ Datenvalidierung hin? Sie implizieren, dass Sie keine aktivierten Ausnahmen verwenden sollten, sondern dann einschränken, wofür nicht aktivierte Ausnahmen verwendet werden sollen.
Robin

1
Was ich damit sagen will ist, dass der Entwickler nicht gezwungen werden sollte, geprüfte Ausnahmen abzufangen. Sie müssen also nicht in der Methodensignatur deklariert werden. In Java können Sie sie wie Spring in Laufzeitausnahmen umwandeln. Ich sage auch, dass Laufzeitausnahmen nur in nicht wiederherstellbaren Situationen ausgelöst werden sollten.
kgiannakakis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.