Trabalhando com Array

11 respostas
P

Pessoal,

estou estudando sobre arrays no java…
Gostaria de esclarecer uma dúvida:

Tenho o seguinte código:

Dog [][] dog = new Dog [3][]; dog [0][1] = new Dog(); dog [1][2] = new Dog(); dog [2][3] = new Dog();

ele está lançando um erro de compilaçao…Exception NullPointerException…
gostaria de saber o pq…
Dog [][] dog = new Dog [3][];
o [3] indica o numero de referencias q eu desejo q tenha …penso eu q o [] após seja “infinito”…rs
alguem poderia me ajudar?!

11 Respostas

Grinvon

Um array é um conjunto de objetos, sendo objetos se eles não estiverem instanciados provocamente não terão referência.

Sendo esse um array multidimensional, ao tentar compilar ele conseguirá acessar a primeira dimensão, mas ao tentar acessar pela segunda, ex: [1][3], provocará erro, pois não foi instanciado.

Tente fazer por exemplo:

Object [][] dog = new Object [3][10];

Você poderá acessar até 11 unidades na segunda dimensão, já que corre de 0 até 10.

P

Grinvon,

vlw pela resposta cara…
mas a questao eh: o que seria esse segundo []? O q acontece qnd eu nao informa o total de elementos?! fica infinito?

Grinvon

Não, não fica infinito já que arrays em Java você sempre deve informar pelo menos a quantidade de elementos de uma dimensão, para os objetos serem instanciados na memória.

Infelizmente devido a isso os arrays se tornam “presos” em termos de flexibilidade, e por isso a depender da necessidade usamos as chamadas Collections para nos dar mais liberdade.

Como você precisa informar ao menos um, só poderemos acessar e atribuir valores a um array caso o objeto nele estiver instanciado.

Andre_Brito

Não fica. Acho que é porisso que dá NullPointerException.

P

Grinvon:
Não, não fica infinito já que arrays em Java você sempre deve informar pelo menos a quantidade de elementos de uma dimensão, para os objetos serem instanciados na memória.

Infelizmente devido a isso os arrays se tornam “presos” em termos de flexibilidade, e por isso a depender da necessidade usamos as chamadas Collections para nos dar mais liberdade.

Como você precisa informar ao menos um, só poderemos acessar e atribuir valores a um array caso o objeto nele estiver instanciado.

pô, então, se eu tenho q informar apenas uma dimensão, qual o tamanho que a VM vai dar para a segunda dimensao?
:?

Grinvon

Fiz dessa forma para você entender mais simples.

Bom, para cada dimensão que eu for criar ele está criando objetos.

Se eu defini Object[][] dog = new Object[1][];

Na verdade criei dois objetos, um para referenciar a variável dog, que liga com um elemento que será uma posição da primeira dimensão. Para o compilador você não definiou a segunda, portanto não criou objeto algum para ela, se tentar acessar dará o NullPointerException.

Se eu fizer:

Object [][] dog = new Object [3][]; dog [0] = new Object[2]; dog [1] = new Object[4]; dog [2] = new Object[1];

Defini na primeira linha a quantidade do meu primeiro array, como são 3 posições e a posição começa pelo zero, então terei 0, 1 e 2 e não 1, 2 e 3 como alguns iniciantes podem pensar.

depois criei na segunda linha em diante objetos para a segunda dimensão, o elemento 0 irá apontar para 0 e 1, o elemento 1 irá apontar para 0, 1, 2 e 3, e o elemento 2 da primeira dimensão irá apontar para o 0.

Veja nesse código o tamanho total:

System.out.println(dog[0].length); System.out.println(dog[1].length); System.out.println(dog[2].length);

P

Grinvon , estou QUASE entendendo…

consegui entender perfeitamente o que vc mostrou ai…
agora, como ficaria esse seu desenho, caso tivéssemos:

Object[][] dog = new Object[1][3];

[]'s camarada

Grinvon

pardal_nb:
Grinvon , estou QUASE entendendo…

consegui entender perfeitamente o que vc mostrou ai…
agora, como ficaria esse seu desenho, caso tivéssemos:

Object[][] dog = new Object[1][3];

[]'s camarada

Veja:

Agora me diga você, quantos elementos posso ter aí?

P

3 elementos

[0][0]
[0][1]
[0][2],

certo?! :oops:

Grinvon

Isso mesmo, você já ta pegando o jeito. []´s

caiocout

bom tentando explicar mais ainda:

quando vc faz

Dog [][] dog = new Dog[3][];

vc está criando uma “matriz” de dog com 3 linhas porém essas linhas ainda não possuem extensão (número de colunas).
um dos pontos fortes quando se utiliza arrays em Java é que as linhas não necessitam ter o mesmo numero de colunas, podemos instanciar cada linha com uma quantidade diferente, como o exemplo a seguir:

dog[0] = new Dog[5]; //linha indice 0 tem 5 colunas dog[1] = new Dog[2]; //linha indice 2 tem 2 colunas dog[2] = new Dog[10]; //linha indice 3 tem 10 colunas ou uma matilha de cães 8)

Criado 26 de novembro de 2007
Ultima resposta 27 de nov. de 2007
Respostas 11
Participantes 4