2014-12-16 14 views
12

Nach Überprüfung der JavaDocs für eine Methode, die ich dachte, mit requiredNonNull, stolperte ich über die erste mit dem einzigen Parameter (T obj).Was ist der Zweck von Objects # requireNonNull

Jedoch was ist der eigentliche Zweck dieser bestimmten Methode mit dieser Signatur? Alles, was es einfach tut, ist werfen und NPE, die ich etwas positiv bin (als ich hier vielleicht etwas offensichtlich fehlen) würde sowieso geworfen werden.

Würfe: Nullpointer - wenn obj null ist


Letzteres macht tatsächlich Sinn in Bezug auf bestimmten Code debuggen, wie die Doc auch sagt, es in erster Linie für die Parametervalidierung angefertigt

public static <T> T requireNonNull(T obj,String message)

Überprüft, ob der angegebene Objektreferenz nicht null ist, und eine benutzerdefinierte NullPointerException auslöst, falls dies der Fall ist.

Daher kann ich spezifische Informationen zusammen mit der NPE drucken, um das Debuggen um ein Vielfaches einfacher zu machen.

In diesem Sinne bezweifle ich sehr, dass ich auf eine Situation stoßen würde, in der ich lieber nur die erstere stattdessen verwenden würde. Bitte erleuchte mich.

tl; dr - Warum würden Sie jemals die Überladung verwenden, die keine Nachricht nimmt.

+0

Was ist Ihre eigentliche Frage? Sie haben die Frage, die Sie im Titel gestellt haben, bereits selbst beantwortet. – Radiodef

+0

@Radiodef Sotirios Delimanolis fasst es am besten zusammen - "Ich denke, die Frage, aus dem Körper, ist, warum würdest du jemals die Überladung benutzen, die keine Nachricht nimmt." – Juxhin

+0

Sie sollten Ihre Frage bearbeiten, um sie dann zu klären. – Radiodef

Antwort

25

Ein gutes Prinzip beim Schreiben von Software ist es, Fehler so früh wie möglich zu erkennen. Je schneller Sie bemerken, dass beispielsweise ein ungültiger Wert wie null an eine Methode übergeben wird, desto einfacher ist es, die Ursache zu ermitteln und das Problem zu beheben.

Wenn Sie null an eine Methode übergeben, die angeblich nicht null zu erhalten, ein NullPointerException wird wahrscheinlich irgendwo passieren, wie Sie vielleicht schon bemerkt. Die Ausnahme kann jedoch erst nach einigen weiteren Methoden auftreten, und wenn sie irgendwo tief unten auftritt, wird es schwieriger, die genaue Fehlerquelle zu finden.

Also, es ist besser, wenn Methoden ihre Argumente im Voraus überprüfen und eine Ausnahme auslösen, sobald sie einen ungültigen Wert wie null finden.

bearbeiten - Über die Version Ein-Parameter: auch wenn Sie eine Fehlermeldung nicht bieten, werden Argumente und wirft eine Ausnahme frühe Überprüfung nützlicher sein als im Stich gelassen die null Pass nach unten, bis eine Ausnahme irgendwo tiefer geschieht nach unten . Der Stack-Trace zeigt auf die Zeile, in der Sie Objects.requireNonNull(...) verwendet haben, und es sollte für Sie als Entwickler offensichtlich sein, dass Sie null nicht überschreiten sollten. Wenn Sie implizit eine NullPointerException passieren lassen, wissen Sie nicht, ob der ursprüngliche Programmierer die Absicht hatte, dass die Variable nicht null sein sollte.

+1

Ich denke die Frage, vom Körper aus, warum würdest du jemals die Überladung benutzen, die keine Nachricht nimmt. –

+0

Ich stimme dem Prinzip der Fehlererfassung so früh wie möglich zu, aber eine NullPointerException klingt für mich seltsam. Wenn Sie sich Zeit nehmen, es zu überprüfen, nehme ich an, dass Sie eine freundlichere Ausnahme wie InvalidParmeterException oder etwas Ähnliches werfen könnten. – RLM

+1

@RaphaelMoita Die Standardausnahme, die angibt, dass ein Argument ungültig ist, ist 'IllegalArgumentException'. Die Designer von 'Objects.requireNonNull (...)' haben sich stattdessen dafür entschieden, 'NullPointerException' zu verwenden ... – Jesper