java intellij if(data == null)?


03.03.2023, 20:09

Dieses if(data == null) macht doch gar keinen Sinn, wenn data ein int array ist?

4 Antworten

Was soll jetzt diese Prüfung if(data == null) ???

Eine Variable/ein Objekt kann zwar deklariert sein, muss aber nicht unbedingt initialisiert sein.

Jemand könnte z.B. hingehen und folgenden Code produzieren:

int[] data;
boolean result = hasDuplicates2(data);

Data ist jetzt zwar deklariert und kann als Variable benutzt werden, hat aber kein dahinterliegendes Array gespeichert, welches Daten enthalten kann. Die Variable enthält nichts - null.

Es kann auch sein, dass der Compiler direkt meckert, dass die Variable nicht initialisiert wurde, das müsste man einfach Mal ausprobieren. Es geht aber darum, den Fall abzudecken, dass jemand null übergibt

Woher ich das weiß:Studium / Ausbildung – Abgeschlossenes Studium der Informatik (B.Sc.)

Das ist der Unterschied zwischen einer "normalen" Variable und einem Zeiger(Referenz).

Vielleicht mal mit dem Thema bisschen befassen, um das zu verstehen. Das ist kein reines Java-Thema. Schaue dir mal die Sprache C an. Es lohnt sich! Da wird gezielt mit den Zeigern gearbeitet, um besonders effizient zu programmieren. Da geht dir vllt ein Licht auf, warum bestimmte Sachen in anderen Programmiersprachen so sind, wie sie sind (z.B. warum du bei Strings .equals() benutzen musst, während du ein int mit == vergleichst, was mit Strings mal funktioniert, mal nicht)

In Java funktioniert das ganz nämlich ähnlich, nur dass den Zeigern das * fehlt und Java dich nicht mit den Zeigern rumspielen lässt, wie man es bei C kann. Das Zeigerthema wird ein bisschen versteckt.

Eine normale Variable enthält den Wert direkt (ein int ist ein int... eine Zahl).

Eine Referenz (Objektvariable oder auch ein Array) ist hinter den Kulissen auch ein int, der nur die Speicheradresse enthält, an dem der eigentliche Variableninhalt ist. Ein Zeiger halt.

In Java sind nur die wenigen primitive (int, boolean, byte...) "normale" Variablen.

Alle anderen Variablen sind immer Zeiger.

Wenn du eine Objektinstanz erzeugst, passiert im Hintergrund folgendes: Es wird ein Speicherbereich reserviert -> Konstruktor wird aufgerufen -> Speicherbereich wird mit der Instanz befüllt -> Es wird ein Zeiger auf diesen Speicherbereich in einer Variable zurückgegeben, womit du dann weiterarbeitest. Du hast nun einen Zeiger auf die Instanz - Dein Objekt.

Zeiger sind im Gegensatz zu den primitiven nullbar. Ein null-Zeiger zeigt auf die Speicheradresse 0, was gleichbedeutend mit keiner Speicherzuweisung ist. Also Zeiger zeigt auf nichts. NullPointer halt. Ungültig.

Und das musst du prüfen, wenn du darauf zugreifst, weil es dir sonst die schöne NullPointerException beschert.

Und auch gut zu wissen ist "by Reference" vs. "by Value":

int[] a = new int[4];

int[] b = a; //by reference, da nicht primitiv, es wird nur der Zeiger kopiert, nicht das Array! a und b zeigen auf das gleiche Array. Wenn du b änderst, änderst du auch a;

int a = 4;

int b = a; //by value, da primitiv. Du hast nun zwei voneinander unabhängige int-Variablen.

Woher ich das weiß:Berufserfahrung

kannste eig rausnehmen. du kannst die funktion ja nicht mit einem null parameter aufrufen, da eben ein int array erwartet wird. beim versuch würde der compiler rumheulen.

TheQ86  03.03.2023, 20:13

Das stimmt nicht.

0
Waldemar6585  03.03.2023, 20:16
@TheQ86

In C würde es stimmen. Ich kann die Antwort aber nicht löschen.

0

In Java kann immer null übergeben werden, wenn ein Objekt erwartet wird. In Java sind auch Arrays Objekte. Syntaktisch ist dies also durchaus zulässig und eine valide Abfrage.

Die Nutzung von Optionals in Java ist keine Pflicht.

Woher ich das weiß:Berufserfahrung – Berufserfahrung
RedDevil1982 
Fragesteller
 03.03.2023, 20:11

In Ordnung. Danke!

Was meinst du mit Optionals?

"Die Nutzung von Optionals in Java ist keine Pflicht."

0