Ist es in Ordnung, NullPointerException programmgesteuert auszulösen? [closed]

Lesezeit: 8 Minuten

Benutzer-Avatar
Strauß

Wenn es eine Nachbedingung gibt, darf der Rückgabewert einer Methode nicht null sein, was kann man tun?

ich könnte

assert returnValue != null : "Not acceptable null value";

aber Behauptungen könnten ausgeschaltet werden!

Also ist es in Ordnung zu tun

if(returnValue==null)
      {
           throw new NullPointerException("return value is null at method AAA");
      }

?

Oder ist es besser, eine benutzerdefinierte Ausnahme (wie NullReturnValueException ) für eine solche Bedingung zu verwenden?

  • Zur Wahl zwischen Assert oder Nullprüfung: Gehen Sie davon aus, dass Assert nur in Entwicklungsumgebungen verwendet wird und dass Asserts nur Plausibilitätsprüfungen für Sie oder andere Entwicklungen sind. Nullprüfungen hingegen sind für alle Arten von Client-Interaktionen (entweder mit einem Benutzer oder einer anderen Person, die Ihren Code verwendet, wie in einer öffentlichen API) und werden zur Laufzeit in allen Umgebungen ausgeführt.

    – cthulhu

    18. Januar 2011 um 11:32 Uhr

Benutzer-Avatar
römisch

Ich würde dir empfehlen, niemals zu werfen NullPointerException von dir selbst.

Der Hauptgrund, dies nicht zu tun, ist, wie Thorbjørn Ravn Andersen in einem Kommentar unten sagt, dass Sie „echte, schlechte NPEs“ nicht mit absichtlich geworfenen NPEs mischen wollen.

Bis Sie sicher sind, dass Sie in der Lage sind, „gültige“ NPE zu erkennen, würde ich die Verwendung empfehlen IllegalArgumentException wenn Sie das Ihrem API-Benutzer mitteilen möchten null ist kein gültiger Argumentwert. Das Verhalten Ihrer Methode bei der Übergabe von ungültigen Nullparametern sollte dokumentiert werden.

Eine andere (imho modernere) Option ist die Verwendung @NotNull Anmerkung neben dem Argument. Hier ist ein Artikel über die Verwendung der Annotation @NotNull.

Wie ich bereits erwähnt habe, kann es auch Fälle geben, in denen das Werfen von NPE weder für Sie noch für Ihre Teamkollegen verwirrend ist: Die Ursache für NPE sollte klar und erkennbar sein.

Wenn Sie beispielsweise eine Bibliothek mit Vorbedingungsmodul verwenden, wie z Guavadann finde ich Verwendung checkNotNull()-ähnliche Methoden sind eine bevorzugte Methode, um mit illegal übergebenen Nullen umzugehen.

checkNotNull(arg, msg) wirft NPE, aber aus dem Stacktrace ist ziemlich klar, dass es von produziert wurde Preconditions.checkNotNull() und daher handelt es sich nicht um einen unbekannten Fehler, sondern um ein erwartetes Verhalten.

  • Eigentlich ist NullPointerException eine Großartig Weise zu sagen, dass ein Argument nicht null sein sollte. Siehe Effektives Java: Alle fehlerhaften Methodenaufrufe laufen wohl auf ein illegales Argument oder einen illegalen Zustand hinaus, aber andere Ausnahmen werden standardmäßig für bestimmte Arten von illegalen Argumenten und Zuständen verwendet. Wenn ein Aufrufer null in einem Parameter übergibt, für den Nullwerte verboten sind, schreibt die Konvention vor, dass NullPointerException statt IllegalArgumentException ausgelöst wird.

    – Whiskysierra

    24. Juli 2010 um 13:53 Uhr

  • Schau dir mal das Javadoc an: Anwendungen sollten Instanzen dieser Klasse auslösen, um auf andere illegale Verwendungen des Nullobjekts hinzuweisen. Das ist mir ziemlich klar. Das Werfen von NPEs ist legal und gültig und sollte für jeden Nicht-Null-Parameter durchgeführt werden, wenn null übergeben wird. Punkt.

    – Whiskysierra

    24. Juli 2010 um 18:56 Uhr

  • @willi, dass npe nur von der Laufzeit ausgelöst wird, nicht von Ihrem eigenen Code, macht es einfach zu bestimmen, wie ernst ein npe ist.

    – Thorbjørn Ravn Andersen

    25. Juli 2010 um 15:21 Uhr

  • Ich stimme Whiskeysierra zu. Ein NPE ist der Weg, um zu sagen, dass ein Methodenparameter null war, und ist die perfekte Ausnahme dafür. Nicht IllegalArgumentException. Auch das Einwerfen in Ihren eigenen Code unterscheidet sich nicht von einem NPE, das in den Java-Bibliothekscode eingeworfen wird. Ich codiere per Vertrag und daher bekommt der Benutzer meiner Methode, was er erwarten sollte, wenn er das Javadoc meiner Methode liest. Wenn Sie es werfen, wird verhindert, dass der Code weiter ausgeführt wird (früh fehlschlägt); andernfalls schlägt es sowieso an einer Stelle fehl, die völlig unabhängig davon ist, wo sich der eigentliche Fehler befindet. NPEs sollten immer ernst genommen werden, da sie auf einen Programmierfehler hindeuten.

    – Timmos

    8. Januar 2015 um 9:42 Uhr

  • Letztendlich ist dies eine Diskussion für Softwareengineering.SE, aber in Bezug auf die Verwendung von Code als Möglichkeit Modell Verhalten ist das Werfen einer NPE trotz der Dokumentation nicht hilfreich. Nehmen Sie es von erfahrenen Informatikern AUTO Hoare, der die schiere Erfindung der Nullreferenz als seinen „Milliarden-Dollar-Fehler“ bezeichnet. Was besser ist, als eine NPE zu werfen, ist, den Anrufer darüber zu informieren, warum die Eingabe ungültig war. es ist gut zu sagen, dass die Eingabe null war, aber es ist besser zu sagen, dass das Argument ungültig ist, weil null keine gültige Option ist.

    – Michael Plautz

    5. Februar 2018 um 19:47 Uhr

Ich sehe kein Problem darin, eine NPE so früh wie möglich zu werfen, bevor die JVM dies für Sie erledigt – insbesondere für Nullargumente. Es scheint einige Diskussionen darüber zu geben, aber es gibt viele Beispiele in den Java SE-Bibliotheken, die genau dies tun. Ich kann nicht verstehen, warum NPE in dem Aspekt heilig sein sollte, dass Sie es nicht selbst werfen können.

Allerdings schweife ich ab. Bei dieser Frage geht es um etwas anderes. Sie sprechen von einer Nachbedingung, die besagt, dass der Rückgabewert nicht null sein darf. Sicherlich würde null in diesem Fall bedeuten, dass Sie einen Fehler haben innerhalb der sehr Methode?

Wie würden Sie das überhaupt dokumentieren? “Diese Methode löst eine NullPointerException aus, wenn der Rückgabewert unerwartet null ist”? Ohne zu erklären, wie das passieren konnte? Nein, ich würde hier eine Behauptung verwenden. Ausnahmen sollten für Fehler verwendet werden, die möglicherweise passieren können – nicht um Dinge abzudecken, die passieren können, wenn innerhalb der Methode etwas nicht stimmt, denn das hilft niemandem.

  • Im Fall eines Nullarguments IllegalArgumentException könnte die geeignetere Ausnahme zum Auslösen sein. NullPointerException soll anzeigen, dass versucht wurde, eine Operation mit einem Nullwert auszuführen. Wenn Sie eine NPE anstreben, verzichten Sie einfach auf die Nullprüfung in Ihrer Methode, und die NPE wird natürlich von der JVM ausgelöst.

    – Joshua Jones

    29. Juni 2017 um 12:22 Uhr


Angesichts dessen NullPointerException ist die idiomatische Art, einen unerwarteten Nullwert in Java zu kommunizieren, ich würde empfehlen, dass Sie einen Standard werfen NullPointerException und kein Eigenbau. Denken Sie auch daran, dass das Prinzip der geringsten Überraschung nahelegen würde, dass Sie keinen eigenen Ausnahmetyp für einen Fall erfinden, in dem ein Systemausnahmetyp vorhanden ist.

Zusicherungen sind gut zum Debuggen, aber nicht gut, wenn Sie bestimmte Bedingungen behandeln müssen, sodass die Fehlerbedingung nicht wirklich gut behandelt werden kann.

Das Problem mit NullPointerException ist, dass es auftritt, wenn Sie vergessen zu prüfen, ob etwas null ist oder das falsche Argument zu geben, das null ist und nicht sollte.

Aus meiner Erfahrung lernen Java-Programmierer sehr schnell, dass diese Ausnahme durch den Fehler im Code verursacht wird, daher wird es extrem verwirrend sein, sie manuell auszulösen die meisten von ihnen. IllegalArgumentException ist eine bessere Idee, wenn Sie inakzeptable Argumente übergeben (z. B. null, wo etwas nicht null sein darf).

Es löst auch eine andere Heuristik aus. NPE = jemand hat hier einen Fehler im Code gemacht, IllegalArgumentException = das der Methode übergebene Objekt ist ungültig.

Auf der anderen Seite sagt das Javadoc:

Anwendungen sollten Instanzen dieser Klasse auslösen, um dies anzuzeigen
andere illegale Verwendungen der null Objekt.

NPE zu werfen wäre also legalaber es ist nicht die übliche Praxis, also würde ich empfehlen IllegalArgumentException.

Es gibt sicherlich kein universelles Gesetz gegen das Auslösen einer NullPointerException, aber es ist schwer zu beantworten, ob Sie dies in einem so abstrahierten Beispiel tatsächlich tun sollten. Was Sie nicht tun möchten, ist, die Leute in die Lage zu versetzen, zu versuchen, NullPointerException abzufangen. Code wie folgt (echtes Beispiel, ich schwöre):

catch (NullPointerException npe) {
  if (npe.getMessage().equals("Null return value from getProdByCode") {
    drawToUser("Unable to find a product for the product type code you entered");
  } 
}

Ist ein todsicherer Indikator dafür, dass Sie etwas falsch machen. Wenn also der Null-Rückgabewert ein Indikator für einen Systemstatus ist, den Sie tatsächlich kommunizieren können, verwenden Sie eine Ausnahme, die diesen Status kommuniziert. Es gibt nicht viele Fälle, die mir einfallen, in denen es sinnvoll ist, eine Referenz auf Null zu überprüfen, nur um einen Nullzeiger zu entfernen. Normalerweise hätte die nächste Codezeile sowieso den Nullzeiger (oder etwas Informativeres) weggeschmissen!

  • Dieses spezielle Beispiel würde hoffentlich durch ein leeres ProdCode-Eingabefeld verursacht?

    – Thorbjørn Ravn Andersen

    23. Juli 2010 um 22:51 Uhr

  • Wenn nur, würde das zumindest irgendwie Sinn machen. So behandelte ein Vertragsentwickler, mit dem ich zusammengearbeitet habe, das Ergebnis einer Suche basierend auf Benutzereingaben.

    – Affe

    23. Juli 2010 um 23:09 Uhr

http://pmd.sourceforge.net/pmd-5.0.1/rules/java/strictexception.html

“Vermeiden Sie das Auslösen von NullPointerExceptions. Diese sind verwirrend, da die meisten Leute davon ausgehen, dass die virtuelle Maschine sie ausgelöst hat. Erwägen Sie stattdessen die Verwendung einer IllegalArgumentException; dies wird eindeutig als eine vom Programmierer initiierte Ausnahme angesehen.”

  • Dieses spezielle Beispiel würde hoffentlich durch ein leeres ProdCode-Eingabefeld verursacht?

    – Thorbjørn Ravn Andersen

    23. Juli 2010 um 22:51 Uhr

  • Wenn nur, würde das zumindest irgendwie Sinn machen. So behandelte ein Vertragsentwickler, mit dem ich zusammengearbeitet habe, das Ergebnis einer Suche basierend auf Benutzereingaben.

    – Affe

    23. Juli 2010 um 23:09 Uhr

Benutzer-Avatar
Thorbjørn Ravn Andersen

Ich würde diese Verwendung von NullPointerException für ok halten, wenn Sie erinnern sich an die Beschreibung. Damit hat die untersuchende Person zu tun (Zeilennummern können sich verschieben). Denken Sie auch daran, zu dokumentieren, dass Ihre Methoden in besonderen Fällen Nullzeigerausnahmen auslösen.

Wenn Sie Ihre Methodenparameter gleich zu Beginn überprüfen, a throw new IllegalArgumentException("foo==null") ist für mich auch akzeptabel.

1381770cookie-checkIst es in Ordnung, NullPointerException programmgesteuert auszulösen? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy