Ao executar este programa acontece um nullpointer porque Chicks c não é iniciado, porem esta inciando um objeto para c no método go(), alguém pode explicar porque mesmo criando uma instancia de Chicks no método go(), ele não é setado para c?
nesse seu código vc tem três intancias da classe ChicksYach
quando vc faz new ChicksYach().go(); o c é intanciado
mas dentro do metodo go() vc intancias as outras duas ChicksYach() e passa elas como parametro do construtor das treads e da um start e automaticamente os metodo run() da classe ChicksYach() sera executado mas para essa instancia o metodo go() nunca foi chamado e por isso da nullpoiter
drsmachado
Por que este objeto pertence à instância que cria cada uma das threads.
Ou você instancia c no construtor ou passa o objeto recém criado como argumento do método construtor e, para que seja possível, cria um assim
publicChicksYach(Chicksc){this.c=c;}
Saca?
fabriciov
Apenas no objeto this o c esta inicializado e os runnables passados para as threads são objetos diferentes.
Solução é tornar Chicks c um objeto estático ou oque o amigo disse acima
rmendes08
Veja bem, cada objeto de uma classe tem suas próprias cópias de suas variáveis de instância. Por exemplo, se eu tenho a classe:
cada objeto do tipo Pessoa (p1 e p2) tem suas próprias das variáveis nome e idade. No seu caso, você cria um objeto da classe ChicksYack no método main e chama o método go() sobre ele. O método go() por sua vez inicializa a variável c desse objeto, porém, ele cria 2 outros objetos novos e passa cada um para uma thread diferente executar o método run(). O problema é que para esses dois objetos novos, a variável c não está sendo inicializada, pois cada um tem sua própria cópia da variável e ela é inicializada no método go(), que inicializou a variável do objeto criado no método main().
Um jeito simples de resolve esse problema é inicializá-la na mesma linha da declaração ou no construtor.
A
alexmonassa
Porque vc não cria um na construtor na classe ChickYach para instanciar o objeto Chick na medida em que uma Thread da Classe é criada . TIpo
public ChickYach () {
c = new Chick();
}
O que vc tá esquecendo é q o objeto Chick tem três cópias , uma da classe ChickYach (ao dar o comando new ChickYach.go()) outras duas das threads ChickYach.start().
Os Objetos Chick das Threads não foram instanciado ainda .