2010-03-03 5 views
69

J'ai un tableau int qui n'a pas d'éléments et j'essaie de vérifier s'il est vide. Par exemple, pourquoi l'instruction if dans le code ci-dessous n'est-elle jamais vraie?Comment puis-je vérifier si un tableau est nul/vide?

int[] k = new int[3]; 

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

Pourriez-vous poster un peu plus de code s'il vous plaît? Le bit où le tableau est initialisé serait utile à voir. –

+0

Je ne suis pas sûr de ce que vous demandez. Surelly pour vérifier si un tableau est null on dirait (array == null) – Paul

+6

Ne voulez-vous pas si (k! = Null) – vickirk

Répondre

152

Il y a une différence essentielle entre un tableau null et un tableau vide. Ceci est un test pour null.

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

"Vide" n'a pas de signification officielle. Je choisis de définir vide comme ayant 0 éléments:

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

Une autre définition de "vide" est si tous les éléments sont null:

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

ou

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

ups, le dernier extrait a 'obj! - null', probablement censé être' obj! = null' –

+2

Ne pas oublier: org.apache.commons.lang3.ArrayUtils.isEmpty (k) – aholub7x

0

Une int tableau sans éléments n'est pas nécessairement null. Il ne sera que null s'il n'a pas encore été alloué. Voir this tutorial pour plus d'informations sur les baies Java.

Vous pouvez tester la longueur du tableau:

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

Je suis d'arrière-plan .net. Cependant, java/C# sont plus ou moins identiques.

Si vous instanciez un type non-primitif (tableau dans votre cas), il ne sera pas nul.
par exemple. int[] numbers = new int[3];
Dans ce cas, l'espace est alloué & chacun de l'élément a une valeur par défaut de 0.

Il sera null, quand vous ne le faites pas new vers le haut.
par exemple.

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

En Java qui ne sera pas compilé, car il vous dira que 'numbers' n'a pas encore été initialisé. "Uninitialized" et "null" ne sont pas la même chose. –

+0

Merci Joachim. Je modifierai le post pour que 'int [] numéros' soit changé en' int [] numbers == null'; En C#, ce n'est pas le cas. – shahkalpesh

14

Regardez sa longueur:

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

Bien qu'il est plus sûr de vérifier nulle en même temps:

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

Un tableau int est initialisée avec zéro, de sorte qu'il ne sera pas en fait jamais contenir des nulls. Seuls les tableaux de l'objet contiennent initialement null.

+0

et si je dois cocher null pour l'entier –

+1

Vous ne pouvez pas vérifier null avec des primitives telles que int. – objects

+2

dépend de l'endroit où vous l'avez déclaré, si en tant que membre de la classe, alors oui, il est initialisé avec des zéros. mais lorsqu'il est déclaré localement à l'intérieur d'une méthode, je crois que c'est un autre cas ... vous devez vous attribuer une valeur initiale. Je suppose. juste une pensée! – ultrajohn

-1

Je crois que ce que vous voulez est

int[] k = new int[3]; 

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

Vous newed vers le haut donc il n'a jamais été va être nulle.

29

ArrayUtils.isNotEmpty(testArrayName) du paquet org.apache.commons.lang3 assure tableau n'est pas nul ou vide

+0

C'était en fait ce que je cherchais –

0

Le point ici est tout simplement que la variable k est non nulle, car elle pointe sur le tableau. Peu importe que le tableau lui-même soit vide. Le test Null dans votre message n'évaluerait que true si la variable k ne pointait vers rien.

1

J'ai testé comme ci-dessous. J'espère que cela aide.

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

Vous pouvez également vérifier s'il y a des éléments dans le tableau en trouvant sa longueur, puis le mettre dans if-else déclaration pour vérifier si elle est nulle.

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