2010-03-03 18 views
69

Ho un array int che non ha elementi e sto cercando di verificare se è vuoto.Come posso verificare se un array è nullo/vuoto?

Ad esempio, perché l'istruzione if nel codice seguente non è mai vera?

int[] k = new int[3]; 

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

Potresti postare un po 'di più del codice per favore? Il bit in cui è stato inizializzato l'array sarebbe utile da vedere. –

+0

Non sono sicuro di cosa stia chiedendo. Sicuramente per verificare se un array è nullo si direbbe (array == null) – Paul

+6

Non vuoi se (k! = Null) – vickirk

risposta

152

C'è una differenza fondamentale tra una matrice null 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 alcun significato ufficiale. Ho scelto di definire vuota come avere 0 elementi:

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

Una definizione alternativa di "vuoto" è che 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; 
    } 
} 
+0

ups, l'ultimo snippet ha 'obj! - null', probabilmente destinato a essere' obj! = null' –

+2

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

0

An L'array int senza elementi non è necessariamente null. Sarà solo null se non è stato ancora assegnato. Vedere this tutorial per ulteriori informazioni sugli array Java.

è possibile verificare la lunghezza dell'array:

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

Sono da sfondo .net. Tuttavia, java/C# sono più o meno uguali.

Se si istanzia un tipo non primitivo (array nel tuo caso), non sarà nullo.
ad es. int[] numbers = new int[3];
In questo caso, lo spazio viene allocato & ogni dell'elemento ha un valore predefinito 0.

Sarà null, quando non new in su.
ad es.

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 'numbers' non è ancora stato inizializzato. "Uninitialized" e "null" non sono la stessa cosa. –

+0

Grazie Gioacchino. Modificherò il post in modo che abbia i numeri interi [] modificati in 'int [] numeri == null'; In C#, non è il caso. – shahkalpesh

14

Osservare sua lunghezza:

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

Anche se è sicuro per verificare nullo allo stesso tempo:

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

Un array int è inizializzato con zero in modo non sarà in realtà mai contenere valori null. Solo gli array di Object conterranno inizialmente Null.

+0

cosa succede se devo controllare null per intero –

+1

Non puoi controllare null con primitive come int. – objects

+2

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

-1

credo che quello che vuoi è

int[] k = new int[3]; 

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

È newed l'alto in modo che non sarebbe mai essere nullo.

29

ArrayUtils.isNotEmpty(testArrayName) dal pacchetto org.apache.commons.lang3 assicura matrice non è nullo o vuoto

+0

Questo era in realtà quello che stavo cercando –

0

Il punto qui molto semplicemente che la variabile k non è nullo perché rimanda a matrice. Non importa che la matrice stessa sia vuota. Il test nullo nel tuo post sarebbe valido solo se la variabile k non puntava a nulla.

1

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

Si può anche verificare se v'è alcun elemento nella matrice scoprendo la sua lunghezza, poi mettere in if-else per verificare se esso è nullo.

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