Wie kann ich überprüfen, ob ein Array null / leer ist?

137

Ich habe ein intArray ohne Elemente und versuche zu überprüfen, ob es leer ist.

Warum ist beispielsweise die Bedingung der if-Anweisung im folgenden Code niemals wahr?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}
Ankit Sachan
quelle
Könnten Sie bitte etwas mehr von dem Code posten? Das Bit, in dem das Array initialisiert wird, wäre nützlich zu sehen.
Mark Pope
Ich bin mir nicht sicher, was du fragst. Surelly, um zu überprüfen, ob ein Array null ist, würde man sagen (array == null)
Paul
7
Willst du nicht wenn (k! = Null)
Vickirk

Antworten:

214

Es gibt einen wesentlichen Unterschied zwischen einem nullArray und einem leeren Array. Dies ist ein Test für null.

int arr[] = null;
if (arr == null) {
  System.out.println("array is null");
}

"Leer" hat hier keine offizielle Bedeutung. Ich entscheide mich, leer mit 0 Elementen zu definieren:

arr = new int[0];
if (arr.length == 0) {
  System.out.println("array is empty");
}

Eine alternative Definition von "leer" ist, wenn alle Elemente sind null:

Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
  if (arr[i] != null) {
    empty = false;
    break;
  }
}

oder

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}
Cletus
quelle
1
ups, das letzte Snippet hat obj !- null, soll wahrscheinlich seinobj != null
user85421
5
Vergessen Sie nicht: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x
Denken Sie daran, === würde nicht funktionieren. Sie müssen == verwenden, da nulles sich um einen anderen Typ handelt.
Elijah Mock
98

ArrayUtils.isNotEmpty(testArrayName)aus dem Paket org.apache.commons.lang3stellt sicher, dass Array nicht null oder leer ist

Shravan Ramamurthy
quelle
20

Schauen Sie sich seine Länge an:

int[] i = ...;
if (i.length == 0) { } // no elements in the array

Obwohl es sicherer ist, gleichzeitig nach Null zu suchen:

if (i == null || i.length == 0) { }
Mike
quelle
1
Wenn Sie sowohl auf Null als auch auf Länge 0 prüfen müssen, ist es wichtig, zuerst wie bisher auf Null zu prüfen, um einen möglichen Nullzeigerfehler zu vermeiden
Bill Milagro
6

Die Methode zum Überprüfen des Arrays auf null oder leer ist auch in org.apache.commons.lang vorhanden:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);
Jackkobec
quelle
5

Ich komme aus .net Hintergrund. Java / c # sind jedoch mehr oder weniger gleich.

Wenn Sie einen nicht primitiven Typ (in Ihrem Fall ein Array) instanziieren, ist dieser nicht null.
B. int[] numbers = new int[3];
In diesem Fall wird der Raum zugeordnet und jedes der Element hat einen Standardwert von 0.

Es wird sein null, wenn Sie es nicht tun new.
z.B

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}
shahkalpesh
quelle
1
In Java wird das nicht kompiliert, da es Ihnen sagt, dass es numbersnoch nicht initialisiert wurde. "Uninitialized" und nullsind nicht dasselbe.
Joachim Sauer
Danke Joachim. Ich werde den Beitrag bearbeiten, um ihn zu int[] numbersändern int[] numbers == null. In c # ist dies nicht der Fall.
Shahkalpesh
2

Ein int-Array wird mit Null initialisiert, sodass es niemals Nullen enthält. Nur Arrays von Objekten enthalten anfangs null.

Objekte
quelle
Was ist, wenn ich null auf Ganzzahl prüfen muss
Ankit Sachan
1
Sie können mit Grundelementen wie int nicht nach null suchen.
Objekte
2
hängt davon ab, wo Sie es deklariert haben, wenn es als Klassenmitglied ja mit Nullen initialisiert wird. Aber wenn es lokal innerhalb einer Methode deklariert wird, glaube ich, dass es ein anderer Fall ist ... Sie müssen selbst einen Anfangswert zuweisen. Ich nehme an. nur ein Gedanke!
Ultrajohn
2

Der Punkt hier ist sehr einfach, dass die Variable k nicht null ist, weil sie auf das Array zeigt. Es spielt keine Rolle, dass das Array selbst leer ist. Der Nulltest in Ihrem Beitrag würde nur dann als wahr ausgewertet, wenn die Variable k auf nichts zeigte.

Hubbabubba
quelle
2

Ich habe wie unten getestet. Ich hoffe es hilft.

Integer[] integers1 = new Integer[10];
        System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
        for (Integer integer : integers1) {
            System.out.println(integer); //prints all 0s
        }

//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
//        integers1[2] = 0;
        for (Integer integer : integers1) {
            System.out.println(integer); //Still it prints all 0s but it is not empty
            //but that manually added 0 is different
        }

//Even we manually add 0, still we need to treat it as null. This is semantic logic.

        Integer[] integers2 = new Integer[20];
        integers2 = null; //array is nullified
//        integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line. 
        if (integers2 == null) {
            System.out.println("null Array");
        }   
Uddhav Gautam
quelle
0

Ein intArray ohne Elemente ist nicht unbedingt null. Es wird nur sein, nullwenn es noch nicht zugewiesen wurde. In diesem Tutorial finden Sie weitere Informationen zu Java-Arrays.

Sie können die Länge des Arrays testen:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}
entspannen
quelle
0
    public boolean empty() {
    boolean isEmpty = true;
    int i = 0;
    for (int j = 0; j < array.length; j++) {
        if (array[j] != 0) {
            i++;
        }
    }
    if (i != 0) {
        isEmpty = false;
    }
    return isEmpty;
}

Dies ist so nah wie möglich an der Überprüfung, ob ein int-Array leer ist. Dies funktioniert zwar nicht, wenn die Ints im Array tatsächlich Null sind. Es funktioniert für {1,2,3} und gibt immer noch false zurück, wenn {2,0}, aber {0} true zurückgibt

Nanatash
quelle
0

In Java 8+ erreichen Sie dies mithilfe der allMatch-Methode "Streams".

Für primitive:

int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)

Für Objekt:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)
Shivang Agarwal
quelle
-1

Ich glaube, was du willst, ist

int[] k = new int[3];

if (k != null) {  // Note, != and not == as above
    System.out.println(k.length);
}

Du hast es neu gemacht, damit es niemals null wird.

Vickirk
quelle
-1

Sie können auch überprüfen, ob das Array Elemente enthält, indem Sie seine Länge ermitteln und es dann in die if-else-Anweisung einfügen, um zu überprüfen, ob es null ist.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
J_fruitty
quelle