Ist es sinnvoll, in Java selbst auf Null zu prüfen [geschlossen]

8

Ich sehe oft java SourceCode, wo eine Null als Wert für eine Methode oder einen Konstruktor nicht erlaubt ist. Eine typische Implementierung sieht so aus wie

%Vor%

Ich sehe überhaupt keinen Sinn darin, denn wenn ich versuche, eine Methode auf einen NullPointer zu setzen, wird das NullPointerException trotzdem geworfen. Ich würde einen Sinn erkennen, wenn diese Methode eine IllegalArgumentException oder eine andere benutzerdefinierte Ausnahme auslösen würde. Kann jemand klarstellen, warum diese Überprüfung sinnvoll erscheint (da ich sehr oft davon ausgehe, dass dahinter Sinn liegt) oder warum es völliger Unsinn ist?

    
Rafael T 26.01.2012, 13:11
quelle

9 Antworten

9

Der von Ihnen gepostete Code macht absolut keinen Sinn. Es sieht wie ein starker Fall von Cargokult-Programmierung aus. Höchstwahrscheinlich hat jemand einen nützlichen Test implementiert, um einmal nach den Bedingungen zu suchen und jemand anders hat den Test so angepasst, dass er so aussieht.

    
nfechner 26.01.2012, 13:13
quelle
6

Es gibt einen Eckfall, in dem so etwas Sinn macht. Wenn Sie someObject nicht verwenden, kann das Kurzschließen des Fehlerfalls zum Anfang der Funktion nützlich sein.

%Vor%     
Dan Neely 26.01.2012 13:27
quelle
5

Nein, das macht nicht viel Sinn, aber nur, weil das Werfen einer NPE keine nützlichen Informationen hinzufügt.

Sie könnten den Fehler schöner machen, indem Sie zum Beispiel eine IllegalStateException werfen:

%Vor%

Aber das fügt auch keinen großen Wert hinzu - abgesehen davon, dass es spezifisch ist was NULL ist (was bei komplexeren Methoden nützlich sein kann)

    
Tim Gage 26.01.2012 13:14
quelle
5

Natürlich möchten Sie nach Null suchen. Dies ist eine Voraussetzung für Ihre Methode, Teil des Vertrags mit den Kunden. Wenn Ihre Methode keine Nulleingabe akzeptieren kann, müssen Sie dies erzwingen.

Die Auswahl der Ausnahme könnte besser sein. Ich gehe normalerweise mit einem IllegalArgumentException .

Wenn es die Kürze der Methode ist, die Sie stört, muss ich sagen, ich stimme zu. Keine neuen Informationen dort.

    
duffymo 26.01.2012 13:15
quelle
4

Dies hängt davon ab, wer dafür verantwortlich ist, sich von dieser Situation zu erholen. Wenn es der Anrufer ist, werfen Sie eine NPE. Wenn es die aufgerufene Methode ist, testen Sie auf null und tun Sie alles, was notwendig ist, um die Situation zu lösen.

Bearbeiten: Werfen Sie eine NPE nicht explizit, sondern lassen Sie sie einfach platzen. Entschuldigung für die vagen Formulierungen.

    
user647772 26.01.2012 13:12
quelle
2

Die von Ihnen beschriebene Situation kann unter einer der folgenden Annahmen nützlich sein:

1.) Wenn Sie einige Operationen durchführen müssen, die entweder kostspielig sind oder einen globalen Status vor der Ausführung someObject.aMethodCall() ändern, können Sie Rollback-Code und Verschwendung von Ausführungszyklen verhindern.

2.) Wenn someObject in einer Datenstruktur gespeichert ist, können Sie eine mögliche Fallstricke erzeugen, wenn zu einem späteren Zeitpunkt die Daten aus der Datenstruktur abgerufen werden. Ich denke, ich erinnere mich an einige Klassen im Java-Collection-Framework, die eher ein NPE werfen, als eine Null in die Speicherstruktur zu erlauben.

    
Jonathan 26.01.2012 13:24
quelle
2

Persönlich ist der Grund, warum ich nie eine NullPointerException als Teil einer öffentlichen API-Methode werfen würde, weil es es für den Programmierer viel schwieriger macht, zwischen einem Programmierfehler auf seiner Seite und einem Fehler in meinem Code zu unterscheiden absichtlich zulassen, dass die NPE geworfen werden oder nicht?).

Das Werfen einer anderen Ausnahme macht die Absicht viel klarer und hilft dem Programmierer auch herauszufinden, was falsch ist. Also würde ich mit IllegalArgumentException dorthin gehen.

Wenn es eine interne Methode ist? Ich würde Behauptungen verwenden oder es einfach zum Absturz bringen. Es hat keinen Sinn, explizit ein NPE-Imo zu werfen.

    
Voo 26.01.2012 13:33
quelle
0

Ich denke, diese Art der Überprüfung macht Sinn, wenn eine Methode eine Verarbeitung vornimmt, die viel Zeit in Anspruch nimmt oder schwer rückgängig zu machen ist, bevor sie tatsächlich die NPE auslöst. Im gegebenen Beispiel finde ich das nicht sinnvoll.

Andererseits kann es sinnvoller sein, assert zu verwenden oder eine spezifischere Ausnahme wie IllegalArgumentException auszulösen.

    
Mark Rotteveel 26.01.2012 13:19
quelle
0

In C # existiert eine ArgumentNullException. Diese Ausnahme übernimmt den Namen des Arguments im Konstruktor. So konnte der Aufrufer sehen, welches Argument möglicherweise unzulässig ist. Die IllegalArgumentException ist fast die Java-Entsprechung dazu.

    
Mr_T 26.01.2012 13:22
quelle