Possivelmente pq você esta sempre adicionando a mesma instancia x vezes no arraylist, o correto é sempre criar um novo objeto antes de inserir
for(inti=0; i < 5; i++) {Pessoapessoa=newPessoa();pessoa.setId(i);lista.add(pessoa);
}
S
Spacquinho
publicclassTesteEstranho{staticGenestrutura;/** * @param args the command line arguments */publicstaticvoidmain(String[]args){System.out.println("iniciando");ArrayList<Gen>test=newArrayList<>();Geng=estrutura;g.nome=("TESTEEEEEEE");test.add(0,estrutura);test.add(1,g);System.out.println("----------------");for(intc=0;c<=test.size()-1;c++){System.out.println(test.get(c).nome);}}}
staroski
publicclassTesteEstranho{staticGenestrutura;// essa variável não foi inicializadapublicstaticvoidmain(String[]args){System.out.println("iniciando");ArrayList<Gen>test=newArrayList<>();Geng=estrutura;// aqui você declara a variável g e inicializa com estrutura, que está nullg.nome=("TESTEEEEEEE");// aqui vai acontecer NullPointerException pois não dá pra acessar membros de objetos nulltest.add(0,estrutura);// estrutura e g são o mesmo objeto por isso você acha que é um clonetest.add(1,g);System.out.println("----------------");for(intc=0;c<=test.size()-1;c++){System.out.println(test.get(c).nome);}}}
S
Spacquinho
nn mike, o negócio é tipo, eu tenho um elemento (classe que eu mesmo criei) e adiciono duas vezes ele no array list, mas eu nn consigo mexer neles separadamente quando quero fazer isso pelo array list que eu criei.
Dragoon1 like
Duvida?
Você está adicionado 2 vezes a mesma instância de um determinada classe e quer mexer separadamente?
Se for isso você precisa entender com funciona um instância da mesma classe, porque, o dado é do tipo referencia, ou seja, a mesma instância em posições de arrays diferentes você mexe em uma e consequentemente mexeu nas demais …
De um lida em variável por valor e variável por referencia (referencia significa que todas apontam pro mesmo endereçamento de memória)
usando o exemplo que o Mike deu ali pra cima nas respostas, eu consegui fazer um treco um pouco diferente, aparentemente deu certo separando a classe em subclasses (no caso a mais importante) e depois usar o “new” pra criar um novo objeto.
S
Spacquinho
tem mais alguma forma de resolver isso? @Dragoon@Mike
S
Spacquinho
@staroski acho que o problema no caso foi dar esse NullPointerException, pq na parte que eu escrevo: g.nome(“TESTEEEEEEE”) , eu uso pra diferenciar o “g” da “estrutura”
Na parte que vc diz sobre a “estrutura” não estar inicializada, nn tem problema, tem uma outra parte no programa principal que já faz isso
staroski1 like
E como você quer diferenciá-los se ambos são o mesmo objeto?
Quando você faz g = estrutura você está dizendo que a variável g aponta para o mesmo endereço de memória que a variável estrutura.
Então o código que você postou é diferente do código que você está executando.
Pois o código postado não inicializa a variável estrutura em lugar algum, então o seu código equivale exatamente à isso aqui: g = null
S
Spacquinho
o codigo inicial é muito grande, deve ter pelo menos umas 5 ou 6 páginas de código. Então eu fiz esse programa apenas para servir pra teste, no caso o problema que estava dando no principal era o mesmo deste, então fui fazendo uns testes e consegui reproduzir o mesmo tipo de problema. Que no caso eu já resolvi (em parte), fazendo com que eu “desmembre” a classe Gen em outra subclasse e depois reunir essas subclasses pra formar novamente o Gen, aparentemente deu certo pra diferenciar o “nome”, porém não são todas as variáveis dentro da classe que se tornam “livres”, apenas o nome
*obs: a solução eu só consegui resolver no programa principal e ela ainda não está completa, quando eu resolver tudo daí eu mando.
a parte mais curiosa disso é que a variável “nome”, no programa principal, está funcionando normalmente, porém as outras variáveis que também deviam estar “livres” continuam como “clones”, tem algum jeito de resolver isso de forma mais fácil?? @staroski
staroski
Você não está clonando nada.
Você está manipulando o mesmo objeto.
No código acima, as variáveis objetoX, a, b, c e d são todas o mesmo objeto.
Não são clones, são a mesma referência, o mesmo endereço de memória, o mesmo ponteiro…
S
Spacquinho
Então a solução seria diferenciar a variável objetoX antes de colocá-la na variável b certo?
o duro é que o programa é muito grande, pra conseguir achar aonde que está o erro demora demais @staroski
staroski
Não. Se você quer objetos diferentes, vai ter que instanciar outro objeto.
S
Spacquinho
no caso como eu posso fazer isso, sendo que eu preciso que os dois objetos (que posteriormente eu irei adicionar em um arraylist) tenham as mesmas coisas (independente do que a classe tiver) mas que não sejam o mesmo objeto?
staroski1 like
Cria um novo objeto e nele você copia as propriedades do outro.