IllegalArgumentException oder NullPointerException für einen Nullparameter? [geschlossen]

25 answers
  • Sie sollten IllegalArgumentException (IAE) und nicht NullPointerException (NPE) aus folgenden Gründen verwenden:

    Zuerst NPE JavaDoc listet explizit die Fälle auf, in denen NPE geeignet ist. Beachten Sie, dass alle von der Laufzeit geworfen werden , wenn null unangemessen verwendet wird. Im Gegensatz dazu könnten die IAE JavaDoc nicht verwendet werden Klarer: "Wird ausgelöst, um anzuzeigen, dass eine Methode ein ungültiges oder unangemessenes Argument erhalten hat." Ja, das sind Sie!

    Zweitens: Wenn Sie eine NPE in einer Stack-Ablaufverfolgung sehen, was glauben Sie dann? Wahrscheinlich hat dieser eine null dereferenziert. Wenn Sie IAE sehen, gehen Sie davon aus, dass der Aufrufer der Methode an der Spitze des Stapels einen ungültigen Wert übergeben hat. Die letztere Annahme trifft wiederum zu, die erstere ist irreführend.

    Drittens: Da IAE eindeutig für die Validierung von Parametern ausgelegt ist, müssen Sie davon ausgehen, dass dies die Standardausnahme der Ausnahme ist warum sollten Sie stattdessen NPE wählen? Sicherlich nicht für ein anderes Verhalten - erwarten Sie wirklich, dass der Aufruf von NPE-Codes von IAE getrennt von der IAE abgefangen wird und dadurch etwas anderes geschieht? Versuchen Sie, eine spezifischere Fehlermeldung zu kommunizieren? Sie können dies jedoch im Exception-Nachrichtentext trotzdem tun, wie Sie es für alle anderen falschen Parameter tun sollten.

    Viertens werden alle anderen falschen Parameterdaten IAE sein. Warum also nicht konsistent sein? ? Warum ist ein illegales null so besonders, dass es eine Ausnahme von allen anderen Arten illegaler Argumente verdient?

    Zum Schluss akzeptiere ich das Argument, das andere Antworten dazu geben Teile der Java-API verwenden NPE auf diese Weise. Die Java-API ist jedoch mit allem, was von den Ausnahmetypen bis hin zu Namenskonventionen der Fall ist, nicht konsistent. Daher denke ich, dass das blinde Kopieren (Ihres bevorzugten Teils der Java-API) nicht gut ist

    15 September 2016
    Toby Speightrmtheis
  • Es scheint, als wäre ein IllegalArgumentException erforderlich, wenn Sie nicht möchten, dass null ein zulässiger Wert ist, und der NullPointerException ausgelöst wird, wenn Sie versuchen, zu verwenden eine Variable, die sich als null herausstellt.

    14 May 2017
    vaxquisEric B.
  • Standardmäßig wird die NullPointerException ausgelöst. Das in der Regel unfehlbare "Effektive Java" behandelt dies kurz in Artikel 42 (erste Ausgabe), Artikel 60 (zweite Ausgabe) oder Artikel 72 (dritte Ausgabe) "Bevorzugen Sie die Verwendung von Standardausnahmen":

    "Wahrscheinlich laufen alle fehlerhaften -Aufrufe auf ein illegales Argument oder einen illegalen Zustand, aber andere Ausnahmen werden standardmäßig für bestimmte Arten von Illegalem verwendet Argumente und -Status: Wenn ein Aufrufer in einem Parameter, für den Nullwerte nicht zulässig sind, einen Nullwert übergibt, schreibt die Konvention vor, dass NullPointerException anstelle von IllegalArgumentException ausgelöst wird. "

    13 January 2018
    GaryF
  • Ich war alles dafür, IllegalArgumentException für Null-Parameter zu werfen, bis ich heute die java.util.Objects.requireNonNull -Methode in Java 7 bemerkte. Mit dieser Methode anstatt zu tun:

     if (param == null) {
        throw new IllegalArgumentException("param cannot be null.");
    }
     

    Sie können Folgendes tun:

     Objects.requireNonNull(param);
     

    und es wird ein NullPointerException ausgegeben, wenn der Parameter, den Sie übergeben, null ist.

    Da diese Methode in der Mitte von [&&7 && Ich nehme an, dass seine Existenz ein ziemlich starkes Indiz dafür ist, dass das Werfen von NullPointerException "die Java-Art, Dinge zu tun" ist.

    Ich glaube, ich bin jedenfalls entschlossen.

    Beachten Sie, dass die Argumente für das Debuggen schwer sind, da Sie NullPointerException natürlich eine Nachricht übermitteln können, was null ist und warum es nicht null sein sollte. Genau wie bei IllegalArgumentException.

    Ein weiterer Vorteil von NullPointerException besteht darin, dass Sie bei sehr leistungskritischem Code auf eine explizite Überprüfung auf null (und eine NullPointerException mit einer freundlichen Fehlermeldung), und verlassen Sie sich einfach auf die NullPointerException, die Sie automatisch erhalten, wenn Sie eine Methode für den Nullparameter aufrufen. Vorausgesetzt, Sie rufen eine Methode schnell auf (d. H. Schlagen Sie schnell aus), haben Sie im Wesentlichen den gleichen Effekt, nur nicht ganz so benutzerfreundlich für den Entwickler. In den meisten Fällen ist es wahrscheinlich besser, explizit zu prüfen und mit einer nützlichen Nachricht zu versehen, um anzugeben, welcher Parameter den Wert null hat. Es ist jedoch schön, die Möglichkeit zu haben, dies zu ändern, wenn die Leistung das Ziel hat, ohne den veröffentlichten Vertrag der Methode / des Konstruktors zu verletzen.

    10 November 2012
    MB.
  • Ich neige dazu, dem Design von JDK-Bibliotheken zu folgen, insbesondere Collections und Concurrency (Joshua Bloch, Doug Lea, die Jungs wissen, wie man solide APIs entwickelt). Wie auch immer, viele APIs im JDK werfen proaktiv NullPointerException.

    Zum Beispiel lautet der Javadoc für Map.containsKey:

    @throws NullPointerException, wenn der Schlüssel ist null und diese Map erlaubt keine Nullschlüssel (optional).

    Es ist absolut zulässig, Ihre eigene NPE zu werfen. Die Konvention besteht darin, den Parameternamen anzugeben, der in der Nachricht der Ausnahme null war.

    Das Muster lautet:

     public void someMethod(Object mustNotBeNull) {  
        if (mustNotBeNull == null) {  
            throw new NullPointerException("mustNotBeNull must not be null");  
        }  
    }
     

    Was auch immer Sie tun, Lassen Sie nicht zu, dass ein falscher Wert festgelegt wird, und werfen Sie später eine Ausnahme aus, wenn anderer Code versucht, ihn zu verwenden. Das macht das Debuggen zu einem Albtraum. Sie sollten immer dem "Fail-Fast-Prinzip" folgen.

    04 November 2015
    mkobitGili
  • Hat das Argument von Jason Cohen gewählt, weil es gut präsentiert wurde. Lass es mich Schritt für Schritt zerstückeln. ; -)

    • Die NPE JavaDoc sagt ausdrücklich, "andere illegale Verwendungen des Nullobjekts" . Wenn es nur auf Situationen beschränkt war, in denen die Laufzeit auf eine Null stößt, wenn dies nicht der Fall sein sollte, könnten alle diese Fälle wesentlich genauer definiert werden.

    • Kann nicht helfen Wenn Sie von einer falschen Sache ausgehen, aber unter der Annahme, dass die Kapselung richtig angewendet wird, sollten Sie sich wirklich nicht darum kümmern, ob eine NULL unpassend dereferenziert wurde, oder ob eine Methode eine unangemessene NULL erkannt und eine Ausnahme ausgelöst hat.

    • Ich würde NPE auswählen über IAE aus mehreren Gründen

      • Es geht genauer um die Art der unzulässigen Operation.
      • Logik, die irrtümlicherweise erlaubt, dass Nullen sich von der Logik unterscheiden, die irrtümlich erfolgt erlaubt unzulässige Werte. Wenn ich beispielsweise Daten validiere, die von einem Benutzer eingegeben wurden, und wenn ich einen nicht akzeptablen Wert erhalte, liegt die Ursache für diesen Fehler beim Endbenutzer der Anwendung. Wenn ich eine Null bekomme, ist dies ein Programmierfehler.
      • Ungültige Werte können zu Stack-Überläufen, zu wenig Speicherplatz, Ausnahmebedingungen usw. führen. In der Tat sind die meisten Fehler an einem bestimmten Punkt vorhanden. als ungültiger Wert in einem Methodenaufruf. Aus diesem Grund sehe ich IAE als das MOST GENERAL aller Ausnahmen unter RuntimeException.
    • Tatsächlich Andere ungültige Argumente können zu anderen Ausnahmen führen. UnknownHostException ,

    11 July 2012
    Rob Kielty
  • Es ist eine Frage des "Heiligen Krieges". Mit anderen Worten, beide Alternativen sind gut, aber die Menschen werden ihre Präferenzen haben, die sie bis zum Tod verteidigen werden.

    17 October 2008
    Steve McLeod
  • Wenn es eine setter -Methode ist und null an sie übergeben wird, wäre es meiner Meinung nach sinnvoller, eine IllegalArgumentException zu werfen. Ein NullPointerException scheint sinnvoller zu sein, wenn Sie tatsächlich versuchen, null zu verwenden.

    Wenn Sie es also verwenden, ist es null, NullPointer. Wenn es übergeben wird und es null, IllegalArgument.

    ist
    30 August 2016
    prograshidJeremy Privett
  • Apache Commons Lang hat eine NullArgumentException Das erledigt einige der hier besprochenen Dinge: Es erweitert IllegalArgumentException und sein einziger Konstruktor nimmt den Namen des Arguments an, das nicht null sein sollte.

    Während ich mich fühle Durch das Auslösen von etwas wie einer NullArgumentException oder IllegalArgumentException werden die außergewöhnlichen Umstände genauer beschrieben. Meine Kollegen und ich haben uns dazu entschieden, Blochs Rat zu diesem Thema zu widmen.

    02 July 2009
    Brian T. Grant
  • Die übliche Vorgehensweise, wenn Sie die IllegalArgumentException (String-Nachricht) verwenden, um einen Parameter für ungültig zu erklären und so viele Details wie möglich anzugeben ... So wurde ein Parameter gefunden Wenn die Ausnahme nicht NULL sein soll, würden Sie Folgendes tun:

     if( variable == null )
        throw new IllegalArgumentException("The object 'variable' cannot be null");
     

    Sie haben praktisch keinen Grund um die "NullPointerException" implizit zu verwenden. Die NullPointerException ist eine Ausnahme, die von der Java Virtual Machine ausgelöst wird, wenn Sie versuchen, Code als Nullreferenz auszuführen (Like toString () ).

    11 August 2008
    Claude Houle