Isso é nomal ou é bug do java

18 respostas
programaçãojava
S

18 Respostas

Mike

Possivelmente pq você esta sempre adicionando a mesma instancia x vezes no arraylist, o correto é sempre criar um novo objeto antes de inserir

for(int i = 0; i < 5; i++) {
    Pessoa pessoa = new Pessoa();
    pessoa.setId(i);

    lista.add(pessoa);
}
S
public class TesteEstranho {
    static Gen estrutura;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("iniciando");
        ArrayList<Gen> test = new ArrayList<>();
        Gen g = estrutura;
        g.nome = ("TESTEEEEEEE");
        test.add(0,estrutura);
        test.add(1,g);
        System.out.println("----------------");
        for(int c=0;c<=test.size()-1;c++){
            System.out.println(test.get(c).nome);
        }
    }
    

}
staroski
public class TesteEstranho {

    static Gen estrutura; // essa variável não foi inicializada

    public static void main(String[] args) {
        System.out.println("iniciando");
        ArrayList<Gen> test = new ArrayList<>();
        Gen g = estrutura; // aqui você declara a variável g e inicializa com estrutura, que está null
        g.nome = ("TESTEEEEEEE"); // aqui vai acontecer NullPointerException pois não dá pra acessar membros de objetos null
        test.add(0,estrutura); // estrutura e g são o mesmo objeto por isso você acha que é um clone
        test.add(1,g);
        System.out.println("----------------");
        for(int c=0;c<=test.size()-1;c++){
            System.out.println(test.get(c).nome);
        }
    }
}
S

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.

Dragoon

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)

@Spacquinho

S

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

tem mais alguma forma de resolver isso? @Dragoon @Mike

S

@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

staroski

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

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.

@staroski

S

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.

Imagina esse código:

TipoDeDado a = objetoX;
TipoDeDado b = objetoX;
TipoDeDado c = a;
TipoDeDado d = b;

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

Então a solução seria diferenciar a variável objetoX antes de colocá-la na variável b certo?

Seria algo do tipo:

objetoX.setValor(m).
TipoDeDado a = objetoX;
objetoX.setValor(n); 
TipoDeDado b = objectoX;

TipoDeDado c = a;
TipoDeDado d = b;
S

só desculpa minha ignorância (e a demora de uma resposta), mas no programa principal (não esse), eu diferenciei o objetoX. Mais ou menos assim:

Gen gene  =  Create( . . . );  (global)
. . .

public Gen Create( . . . ){
   ArrayList<Neuron> neuronios = ...; ( pronta)
   ArrayList<Extension> ligações = new ArrayList();

   for(int c=0;c<=neuronio.lengh()-1;c++){
      Neuron elementoA = (um certo neuronio de uma lista);
      Neuron elementoB = (o neuronio que será ligado a ele);

      Extension ext = new Extension();
     ext.SetEmissor(elementoA);
     ext.SetReceptor(elementoB);
     
     ligações.add(ext);
   }
   
   Gen gen = new Gen(neuronios, ligações); 
   return gen;
}
S

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

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?

staroski

Cria um novo objeto e nele você copia as propriedades do outro.

Criado 23 de janeiro de 2019
Ultima resposta 28 de fev. de 2019
Respostas 18
Participantes 4