Come posso verificare se un array è nullo / vuoto?


137

Ho un intarray che non ha elementi e sto cercando di verificare se è vuoto.

Ad esempio, perché la condizione dell'istruzione if nel codice sottostante non è mai vera?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}

Potresti pubblicare un po 'più di codice per favore? Il bit in cui viene inizializzato l'array sarebbe utile da vedere.
Mark Papa

Non sono sicuro di quello che stai chiedendo. Sicuramente per verificare se un array è nullo si direbbe (array == null)
Paul

7
Non vuoi se (k! = Null)
vickirk

Risposte:


214

C'è una differenza chiave tra un nullarray e un array vuoto. Questo è un test per null.

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

"Vuoto" qui non ha significato ufficiale. Sto scegliendo di definire vuoto con 0 elementi:

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

Una definizione alternativa di "vuoto" è se tutti gli elementi sono null:

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

o

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}

1
up, l'ultimo frammento ha obj !- null, probabilmente pensato per essereobj != null
user85421

5
Non dimenticare di: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x

Ricorda, === non funzionerebbe. Devi usare == perché nullè di tipo diverso.
Elijah Mock

98

ArrayUtils.isNotEmpty(testArrayName)dal pacchetto org.apache.commons.lang3garantisce che l'array non sia nullo o vuoto


20

Guarda la sua lunghezza:

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

Sebbene sia più sicuro controllare contemporaneamente null:

if (i == null || i.length == 0) { }

1
se è necessario controllare sia null che length 0, è importante controllare prima null come hai fatto, per evitare un possibile errore puntatore null
Bill Milagro

6

Su org.apache.commons.lang è presente anche un metodo per controllare l'array per null o vuoto:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

Vengo dallo sfondo .net. Tuttavia, java / c # sono più / meno uguali.

Se crei un'istanza di un tipo non primitivo (array nel tuo caso), non sarà nullo.
ad es. int[] numbers = new int[3];
In questo caso, lo spazio è allocato e ogni elemento ha un valore predefinito di 0.

Lo sarà null, quando non newlo fai .
per esempio

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}

1
In Java che non verrà compilato, perché ti dirà che numbersnon è stato ancora inizializzato. "Non inizializzato" e nullnon sono la stessa cosa.
Joachim Sauer

Grazie Joachim. Modificherò il post per essere int[] numberscambiato in int[] numbers == null; In c #, non è così.
Shahkalpesh,

2

Un array int viene inizializzato con zero, quindi non contiene mai null. Solo le matrici di Object conterranno inizialmente null.


cosa succede se devo controllare null per intero
Ankit Sachan

1
Non è possibile verificare la presenza di null con primitive come int.
oggetti

2
dipende da dove lo hai dichiarato, se come membro della classe, allora sì, viene inizializzato con zero. ma quando dichiarato localmente all'interno di un metodo, credo che sia un altro caso ... devi assegnare tu stesso un valore iniziale. Credo. solo un pensiero!
ultrajohn

2

Il punto qui molto semplicemente è che la variabile k non è nulla perché punta alla matrice. Non importa che l'array stesso sia vuoto. Il test null nel tuo post valuterà vero se la variabile k non puntava a nulla.


2

Ho provato come di seguito. Spero che sia d'aiuto.

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");
        }   

0

Un intarray senza elementi non è necessariamente null. Lo sarà solo nullse non è stato ancora assegnato. Vedi questo tutorial per ulteriori informazioni sugli array Java.

Puoi testare la lunghezza dell'array:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}

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;
}

Questo è il più vicino possibile al controllo se un array int è vuoto. Sebbene ciò non funzionerà quando gli ints nell'array sono effettivamente zero. Funzionerà per {1,2,3} e restituirà comunque false se {2,0} ma {0} restituirà true


0

In Java 8+ si ottiene questo risultato con l'aiuto del metodo allMatch di flussi.

Per primitivo:

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

Per oggetto:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)

-1

Credo che quello che vuoi sia

int[] k = new int[3];

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

L'hai rinnovato, quindi non sarebbe mai stato nulla.


-1

È inoltre possibile verificare se vi sono elementi nell'array scoprendone la lunghezza, quindi inserirlo nell'istruzione if-else per verificare se è nullo.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.