Sobre um exemplo no livro da SCJP 5 da Kathy Sierra

Olá!

bem… eu queria saber onde está o erro, se é no livro, ou se eu estou errando em algo

vejam esse exemplo que está na página 123 do livro:

Dog [] myDogs = new Dog[6];
for (int x = 0; x < myDogs.length;x++){
       myDogs[x] = new Dog();
}

esse compila e funciona perfeitamente
ams agora este usando um enhanced for
agora na página seguinte (p. 124)

Dog [] myDogs = new Dog[6];
for (Dog d : myDogs) 
      d = new Dog();

compila, mas quando tento utilizar do array eu pego uma RuntimeException, o famoso NullPointerException!

segundo o livro, eles são equivalentes, então porque o segundo não funciona?

agradeço pela atenção e se alguem poder me ajudar!

=/ eu ainda continuo com essa dúvida… será que ninguem pode me dar uma luz?

desculpem por dar um up no tópico!

Qual versão do Java está utilizando?

O primeiro caso OK, Java 1.4! Mas enhanced for é JAVA 5.

Da uma java -version ai e verifica qual seu java version

[]´s

Carlos

sim… exato! o primeiro caso é java 1.4

o segundo é java 1.5, mas eu testei o segundo caso no meu pc que tem java 1,5 e no do da faculdade 1.5 e não consegui que funcionasse em nenhum dos dois…

não sei o que pode ser =S

public class Dog 
{
	public static void main(String[] args) 
	{
		Dog [] myDogs = new Dog[6];
		 for (Dog d : myDogs) 
		       d = new Dog();
	}
}

Aqui funcionou normalmente com esse código. Testa aí…

[]´s

Carlos

[quote=Deh]Olá!

compila, mas quando tento utilizar do array eu pego uma RuntimeException, o famoso NullPointerException!

segundo o livro, eles são equivalentes, então porque o segundo não funciona?

agradeço pela atenção e se alguem poder me ajudar! [/quote]

Amigo,

Estes dois códigos são parecidos porém NÃO são iguais…
Observe que no primeiro código o array é populado.

       myDogs[x] = new Dog();

Sendo assim quando finalizar o bloco o array terá seis objetos Dogs. Podendo assim utiliza-los.

       myDogs[1].late();
       myDogs[2].setNome("Thor")

Agora no segundo código o array não é populado. Por isso do NullPointerException quando tenta acessa algum atributo/metodo do objeto.

Dog [] myDogs = new Dog[6];
 for (Dog d : myDogs) 
       d = new Dog();   //Aqui é criado um objeto Dog e 
             //colocado em d, que  tem um escopo apenas dentro do loop.  

Veja um exemplo “tosco”, para ficar igual ao primeiro código…


  Dog [] myDogs = new Dog[6];
  int c = 0;
  for (Dog d : myDogs) {
    d = new Dog();
    myDogs[c] = d;
    c++;
  }
 		       

kissdemon, sim o código compila perfeitamente, mas eu pego um NullPointerException quando tento utilizar myDogs[1] por exemplo…

como o bombbr escreveu o d era uma variavel local dentro do for(Dog d : myDogs) {}
então por isso eu pegava o NPE…
e que na verdade os dois códigos não se equivaliam…

valeu ae!
tirei minha dúvida o/
Obrigado a todos!

O enhanced for faz o seguinte: “Para cada elemento em myDogs, atribua o elemento myDogs atual a váriavel Dog”. Acontece que você não setou nenhum valor para nenhum elemento em myDogs, causando o NPException