Umgang mit null

Aldimann

Bekanntes Mitglied
Hallo zusammen :),

wer kennt es nicht? Returnvalue null und Übergabeparameter null.

Ich hab jetzt schon öfter darüber Diskutiert und wollte eigentlich mal wissen ob es dazu Regelwerke gibt?

Sollte man null als Returnvalue durchgehen lassen? Wenn nicht, was sollt man dann zurück geben, wenn es kein vernünftiges Ergebnis gibt?

Und was ist mit null als Übergabeparameter? Erlaubt? Oder doch lieber eine zweite Methode mit einem Parameter weniger?

Bin gespannt auf die Antworten ;)

Gruß
 

The_S

Top Contributor
Kommt drauf an ;-) .

Wenn es Sinn macht,
Code:
null
zurückzugeben, dann darfst du das auch - ein Beispiel dafür ist eine Map, diese gibt
Code:
null
zurück, wenn der Key nicht gefunden wurde, was ich soweit auch sinnig finde. Wenn es allerdings bspw. in der Methode zu einem Fehler kam, und anstatt dass der Fehler weiter nach oben gereicht wird, einfach nur
Code:
null
zurück gegeben wird, finde ich das weniger sinnnig.

Genauso sieht es bei
Code:
null
als Übergabeparameter aus. Wenn es Sinn macht, dass man [c]null[/c] übergeben darf (simples Beispiel wäre ein Element, das im Konstruktor ein Vorgänger- und Nachfolger-Element erwartet und es einfach (noch) kein Nachfolger-Element gibt) und dieser [c]null[/c]-Parameter auch akzeptabel ist, es also später nicht darauf ohne Überprüfung zugegriffen wird, dann kann man das durchaus machen. Wenn es nicht möglich ist, wird ohnehin früher oder später eine NullPointerException geworfen ;-) .

Ob man dann für jedes Element, das evtl. [c]null[/c] sein könnte, eine eigene Methode schreibt, oder in der API-Dokumentation vermerkt, dass dieser und jener Parameter auch [c]null[/c] sein darf, kommt auch wieder auf den Fall an. Nehmen wir wieder die Map von oben. Eine Map, die als Value null akzeptiert, sollte (meiner Meinung nach) trotzdem nur eine Methode, nämlich [c]put(Object key, Object value)[/c] bereitstellen, und nicht noch zusätzlich die Methode [c]putNullValue(Object key)[/c].

Auf der anderen Seite biete ich bei Beans mit vielen Attributen meistens einen Konstruktor ohne Parameter, einen mit den wichtigsten Parametern und einen mit (fast) allen Parametern an.

Du siehst, es hängt immer vom Anwendungsfall ab.
 

Java-Pelé

Mitglied
Dass der Rückgabewert nicht null sein darf, ist eine klassische Nachbedingung. Prüfe doch, ob das Ding null werden kann.

Java:
assert returnValue != null;
return returnValue;

Schade, dass Java kein DbC der hohen Schule (Eiffel) beherrscht.
 

Aldimann

Bekanntes Mitglied
Danke erstmal!

Klar macht auch Sinn und die Map ist an der Stelle ein ziemlich gutes Beispiel.

Allerdings würde doch eine map folgendes z.B. nicht erlauben (habe es nicht getestet ;) ):
Java:
map.put(null, "irgendwas");
, weil ein null-Key ja keinen Sinn machen würde.

Also kann man doch eigentlich mehr oder weniger festhalten, wenn es sich bei der Übergabe um eine Id oder etwas vergleichbares handelt (ein Key ist auch eine Id wenn man so will), dann sollte da kein null akzeptiert werden. Bei Optionalen Parametern kann man null akzeptieren, sollte es aber in der JavaDoc erwähnen.

Bei möglicher Rückgabe von null, in JavaDoc festhalten wann und warum.

Das war zumindest das was ich aus deinem Post verstanden hab oder hab ich da was falsch verstanden?
 

The_S

Top Contributor
Allerdings würde doch eine map folgendes z.B. nicht erlauben (habe es nicht getestet ;) ):
Java:
map.put(null, "irgendwas");
, weil ein null-Key ja keinen Sinn machen würde.

Warum nicht? Könnte man bspw. als eine Art Default-Wert ansehen. Gibt Maps, die erlauben das (bspw. HashMap) und Maps, die erlauben das nicht.

Also kann man doch eigentlich mehr oder weniger festhalten, wenn es sich bei der Übergabe um eine Id oder etwas vergleichbares handelt (ein Key ist auch eine Id wenn man so will), dann sollte da kein null akzeptiert werden.

eher weniger ;-) . Kommt eben ganz auf den Kontext an. null kann - situationsabhängig - genauso key sein. Genauso kann ein Nicht-Key oder Nicht-ID so wichtig sein, dass es nicht null sein darf.

Bei Optionalen Parametern kann man null akzeptieren, sollte es aber in der JavaDoc erwähnen.

Das sowieso - oder, wenn man ansonsten zu viele "nullable" Parameter hat, Methoden entsprechend überladen.
 
Zuletzt bearbeitet:

Aldimann

Bekanntes Mitglied
Warum nicht? Könnte man bspw. als eine Art Default-Wert ansehen. Gibt Maps, die erlauben das (bspw. HashMap) und Maps, die erlauben das nicht.

eher weniger ;-) . Kommt eben ganz auf den Kontext an. null kann - situationsabhängig - genauso key sein. Genauso kann ein Nicht-Key oder Nicht-ID so wichtig sein, dass es nicht null sein darf.

Das sowieso - oder, wenn man ansonsten zu viele "nullable" Parameter hat, Methoden entsprechend überladen.
Argh ;( das wäre doch soooo ne schöne Faustregel gewesen :/.

Also muss man in jeder Situation durchdenken inwiefern null Sinn macht und danach bestimmen ob nullable oder nicht...
 

FArt

Top Contributor
null ist nicht Nichts! null ist zwar eine besondere Referenz, aber es ist eine Referenz und kann somit als solche verwendet werden.
 

Ebenius

Top Contributor
Jedes mal nachdenken ist eine gute Idee. Null heißt halt kein Objekt und sollte überall dort erlaubt sein wo kein Objekt ein gültiger Zustand ist. Bei einer Methode [c]Node.setParent(Node)[/c] würde ich erwarten, dass [c]null[/c] akzeptiert wird, da kein Elternknoten der normale Zustand des Wurzelknoten eines Baumes ist. Eine Methode [c]readFromStream(InputStream)[/c] etwa sollte [c]null[/c] verbieten, da man von keinem InputStream nun mal nicht lesen kann.

Ebenius
 

Aldimann

Bekanntes Mitglied
Jedes mal nachdenken ist eine gute Idee. Null heißt halt kein Objekt und sollte überall dort erlaubt sein wo kein Objekt ein gültiger Zustand ist. Bei einer Methode [c]Node.setParent(Node)[/c] würde ich erwarten, dass [c]null[/c] akzeptiert wird, da kein Elternknoten der normale Zustand des Wurzelknoten eines Baumes ist. Eine Methode [c]readFromStream(InputStream)[/c] etwa sollte [c]null[/c] verbieten, da man von keinem InputStream nun mal nicht lesen kann.

Ebenius

Vom Prinzip her hast du recht aber bei sowas wäre es ja auch wieder so, wenn die Instanze keine Eltern hat warum dann explizit setzen?
 
M

maki

Gast
Suche mal nach Null Objekt, Landeis kommentar mag zwar extrem erscheinen, ist aber gar eigentlich richtig ;)
 
B

bygones

Gast
Null ist das schwarze Loch des Typsystems, der Milliarden-Dollar-Fehler, die dunkle Seite der Macht, ein Krebsgeschwür, das Metastasen in deinen Code streut. 'nuf said.

Zitat vom hochgeschätzten, intelligenten Doug Lea..... "null sucks"

Jedes mal nachdenken ist eine gute Idee. Null heißt halt kein Objekt und sollte überall dort erlaubt sein wo kein Objekt ein gültiger Zustand ist. Bei einer Methode [c]Node.setParent(Node)[/c] würde ich erwarten, dass [c]null[/c] akzeptiert wird, da kein Elternknoten der normale Zustand des Wurzelknoten eines Baumes ist. Eine Methode [c]readFromStream(InputStream)[/c] etwa sollte [c]null[/c] verbieten, da man von keinem InputStream nun mal nicht lesen kann.

Ebenius
und warum dann nicht einfach ein NullObjekt anstatt null ? durch dieses Entweder-Oder-Vielleicht läuft man mehr Gefahr an falschen Stellen das falsche zu setzen. Würde man sich auf ein NullObjekt einigen wäre das Problem in keiner weise gegeben.

Und ja ich weiß, nicht immer ist ein NullObjekt nutzbar und ja.... alte Diskussion
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
und warum dann nicht einfach ein NullObjekt anstatt null ?
Wenn die Diskussion rein theoretischer Natur ist, bzw. eine völlig eigenständige Umgebung hätte, würde ich das in Erwägung ziehen. Da aber keine Sun-Klasse und keine der Bibliotheken die ich nutze diesen Ansatz verfolgt, sondern überall null der richtige Wert für nicht gesetzt ist, mache ich es so. Die Dinge so zu machen wie sie in der Umgebung üblich sind ist oft von Vorteil.

Aber in Stein gemeißelt ist da natürlich nichts. :)
Ebenius
 
Zuletzt bearbeitet:
B

bygones

Gast
Wenn die Diskussion rein theoretischer Natur ist, bzw. eine völlig eigenständige Umgebung hätte, würde ich das in Erwägung ziehen. Da aber keine Sun-Klasse und keine der Bibliotheken die ich nutze diesen Ansatz verfolgt, gehe ich von dem aus was der Java-Programmierer von meiner API erwarten würde. Aus dem Grund würde ich in einer Java-API eben null unterstützen weil das üblich ist.
nur weil es andere schlecht machen heisst ja nicht dass man dies auch tun muss... und ob der Verwender es "erwartet" hängt von der Dokumentation der API ab...
*kopfschüttel*
 

Ebenius

Top Contributor
nur weil es andere schlecht machen heisst ja nicht dass man dies auch tun muss... [...]
Polemisch: Wenn die Briten in GB auf der linken Straßenseite fahren, ist das super. Wenn sie das in Deutschland auch tun würden, nur weil der Brite links nunmal besser findet, gibt's Chaos. Wie gesagt, polemisch.

[...] und ob der Verwender es "erwartet" hängt von der Dokumentation der API ab...
*kopfschüttel*
Was der Verwender erwartet hängt in erster Linie von seiner Gewohnheit ab. Es ist ja nicht so, dass ein Entwickler die API-Dokumentation jeder Methode die er verwendet gelesen hat. ;-) Die meisten Java-Entwickler würden erstmal erwarten, dass [c]setParent(null)[/c] funktioniert. Weil es eben üblich ist.

Ich will nicht missionieren, so sehe ich's eben. :)

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
J Best Practice Umgang mit unterschiedlichen Tasks Allgemeine Java-Themen 2
A Umgang mit jar Allgemeine Java-Themen 3
Jay_030 Guice: Frage im Umgang mit Unit-Tests Allgemeine Java-Themen 4
Q Umgang mit Reflection Allgemeine Java-Themen 4
Zrebna Wieso sollte man Null-Prüfungen nicht mit Optional-Objekten nutzen? Allgemeine Java-Themen 13
Zrebna SonarLint: Warum kein Null-Referencing-CodeSmell-Hint hier? Allgemeine Java-Themen 23
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
8u3631984 Argument Captor liefert NULL zurück Allgemeine Java-Themen 2
E Class.getResourceAsStream() gibt null zurück Allgemeine Java-Themen 2
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
J Zahlen Abstand zur Null bestimmen Allgemeine Java-Themen 11
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S Validation Null aber nicht Blank und muss Email sein Allgemeine Java-Themen 22
L Google Guice Field Injection returns null Allgemeine Java-Themen 2
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
N MsgPack - Null Check Allgemeine Java-Themen 5
T JasperReports mit Null Pointer Allgemeine Java-Themen 3
DanielsLPecke Compiler-Fehler Warum ist der String null? Allgemeine Java-Themen 10
M Warten bis Variabel nicht null ist Allgemeine Java-Themen 18
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
D Java Process OutputStream ist null Allgemeine Java-Themen 4
O log4j, Problem bei Ausgabe null-Wert Allgemeine Java-Themen 0
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
D Problem mit führender Null bei Schlüsselerzeugung Allgemeine Java-Themen 5
T Variablenübergabe liefert immer null Allgemeine Java-Themen 13
K Image beim catchen ist immer null Allgemeine Java-Themen 9
B Load of Known null Value Allgemeine Java-Themen 9
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
Tobse Vererbung null aus Elternklasse "dominant"? Allgemeine Java-Themen 15
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
I newInstance() liefert null zurück Allgemeine Java-Themen 4
R Attribut null Allgemeine Java-Themen 6
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
E rückgabewert ist immer null Allgemeine Java-Themen 2
N List auf null prüfen Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
R dateFormat - Uhr fängt nicht bei null an Allgemeine Java-Themen 2
P Null in ArrayList Allgemeine Java-Themen 3
N Strings mit null wiedergabe Splitten Allgemeine Java-Themen 4
mongole Formatter + null Allgemeine Java-Themen 4
X Prozess-Objekt nach Ausführung der destroy-Methode null oder nicht null ? Allgemeine Java-Themen 10
L Object = null? Allgemeine Java-Themen 16
L null pointer exception Allgemeine Java-Themen 10
nrg Leere Objektreferenz mit != null vergleichen Allgemeine Java-Themen 4
J Null Pointer in der compare-Methode des Comparators? Allgemeine Java-Themen 18
T Set.contains() auch false wenn value == null? Allgemeine Java-Themen 4
D Matrix, ArrayList, null-Zellen Allgemeine Java-Themen 6
F Hibernate speichern - Null Allgemeine Java-Themen 5
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
T WeakHashMap: Wie "null" effizient abfangen? Allgemeine Java-Themen 5
N Null Durchblick in Java, Jobwechsel? Allgemeine Java-Themen 19
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
N Array mit null Werten filtern Allgemeine Java-Themen 5
S Combobox --> liefer null? Allgemeine Java-Themen 3
A java.net.UnkownHostException: null bei jar-File Allgemeine Java-Themen 16
B Null Pointer Exception bei Canvas-objekt-Aufruf Allgemeine Java-Themen 12
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
R if (obj == null || obj.isEmpty()) Allgemeine Java-Themen 21
P <null> in einer DB abfragen Allgemeine Java-Themen 4
G Nicht abgefangene Null-Pointer-Exception Allgemeine Java-Themen 2
P Image auf einem Panel mit null-Layout Allgemeine Java-Themen 8
M getResourceAsStream immer null Allgemeine Java-Themen 4
R Array komplett auf null setzen Allgemeine Java-Themen 10
A JasperReport Detail bringt null bei Datenübergabe Allgemeine Java-Themen 4
S Null Pointer Exception Allgemeine Java-Themen 10
S instanceof und null Allgemeine Java-Themen 7
M Führende Null in einem Datum Allgemeine Java-Themen 3
L null != null ? Allgemeine Java-Themen 16
Redfrettchen Rückgabe nicht sinnvoll: Exception oder null zurück? Allgemeine Java-Themen 9
B Null- oder IllegalArgumentException Allgemeine Java-Themen 12
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
K Exception im Konstruktor / Objekt == null Allgemeine Java-Themen 7
Z bedeutung (übersetzung) von null? Allgemeine Java-Themen 5
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
C Objekte null setzen? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben