Como posso verificar se uma matriz é nula / vazia?

137

Eu tenho uma intmatriz que não possui elementos e estou tentando verificar se está vazia.

Por exemplo, por que a condição da instrução if no código abaixo nunca é verdadeira?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}
Ankit Sachan
fonte
Você poderia postar um pouco mais do código, por favor? O bit em que a matriz é inicializada seria útil de ver.
Mark Papa
Não tenho certeza do que você está perguntando. Surelly para verificar se uma matriz é nulo se diria (array == null)
Paul
7
Você não quer if (! K = null)
vickirk

Respostas:

214

Há uma diferença fundamental entre uma nullmatriz e uma matriz vazia. Este é um teste para null.

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

"Vazio" aqui não tem significado oficial. Eu estou escolhendo definir vazio como tendo 0 elementos:

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

Uma definição alternativa de "vazio" é se todos os elementos forem 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;
  }
}
cleto
fonte
1
ups, o último snippet obj !- nullprovavelmente deve ser #obj != null
user85421
5
Não se esqueça de: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x
Lembre-se, === não funcionaria. Você deve usar == porque nullé de um tipo diferente.
Elijah Mock
98

ArrayUtils.isNotEmpty(testArrayName)do pacote org.apache.commons.lang3garante que a matriz não seja nula ou vazia

Shravan Ramamurthy
fonte
20

Veja o seu comprimento:

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

Embora seja mais seguro verificar se há nulo ao mesmo tempo:

if (i == null || i.length == 0) { }
Mike
fonte
1
se você precisar verificar nulo e comprimento 0, é importante verificar primeiro o nulo, como você fez, para evitar um possível erro de ponteiro nulo
Bill Milagro
6

O método para verificar a matriz como nulo ou vazio também está presente em org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);
Jackkobec
fonte
5

Eu sou do fundo .net. No entanto, java / c # são mais / menos iguais.

Se você instanciar um tipo não primitivo (matriz no seu caso), ele não será nulo.
Por exemplo, int[] numbers = new int[3];
neste caso, o espaço é alocado e cada elemento tem um valor padrão de 0.

Será null, quando você não fizer newisso.
por exemplo

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}
shahkalpesh
fonte
1
Em Java, isso não será compilado, porque dirá que numbersainda não foi inicializado. "Não inicializado" e nullnão são a mesma coisa.
Joachim Sauer
Obrigado Joachim. Vou editar a postagem para a qual foi int[] numbersalterada int[] numbers == null; Em c #, não é o caso.
precisa saber é o seguinte
2

Uma matriz int é inicializada com zero, portanto nunca conterá nulos. Somente matrizes de objetos conterão nulo inicialmente.

objetos
fonte
E se eu tenho que verificar nulo para inteiro
Ankit Sachan
1
Você não pode procurar nulos com primitivas como int.
objetos
2
depende de onde você o declarou, se como membro da classe, sim, será inicializado com zeros. mas quando declarado localmente dentro de um método, acredito que seja outro caso ... você deve atribuir um valor inicial a si mesmo. Eu suponho. apenas um pensamento!
ultrajohn
2

O ponto aqui de maneira muito simples é que a variável k não é nula porque aponta para a matriz. Não importa que a própria matriz esteja vazia. O teste nulo em sua postagem só seria avaliado como verdadeiro se a variável k não apontasse para nada.

hubbabubba
fonte
2

Eu testei como abaixo. Espero que ajude.

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
fonte
0

Uma intmatriz sem elementos não é necessariamente null. Será apenas nullse ainda não tiver sido alocado. Consulte este tutorial para obter mais informações sobre matrizes Java.

Você pode testar o comprimento da matriz:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}
descontrair
fonte
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;
}

Isso é o mais próximo que cheguei da verificação de se uma matriz int está vazia. Embora isso não funcione quando as entradas na matriz são realmente zero. Ele funcionará para {1,2,3} e ainda retornará false se {2,0}, mas {0} retornará true

nanatash
fonte
0

No Java 8+, você consegue isso com a ajuda do método allMatch de fluxos.

Para primitivo:

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

Para objeto:

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

Eu acredito que o que você quer é

int[] k = new int[3];

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

Você o atualizou para que nunca fosse nulo.

vickirk
fonte
-1

Você também pode verificar se há algum elemento na matriz, descobrindo seu comprimento e colocá-lo na instrução if-else para verificar se é nulo.

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