Estou implementando um projeto de um trabalho da faculdade onde faço uso de multiprogramação com threads. Duas das classes do projeto foram feitas de acordo com o padrão de projeto Singleton, onde vai existir apenas uma instância da classe. Para isso eu defini o construtor dessas classes como private e disponibilizei um método public para a criação da instância, como segue:
private static Relogio instancia;
Porém, quando eu compilo o programa, dá uma mensagem nullPointerException justamente no teste if do método criaInstancia. Eu não tô entendendo por quê. Pois se instancia é static, não é necessário instanciar a variável antes de usá-la.
Eu já tentei isso tb.
E além desse erro, quando eu crio uma referência para a classe Relogio usando: Relogio batida = Relogio.criaInstancia(); … e depois vou usar essa referência para acessar um método de relógio tal como: batida.getPulso ();… também dá o mesmo erro.
S
spierPJ
difícil dizer, já que seu código não está completo.
Relógio por acaso extende Date ou Calendar?
É uma inner class?
…
G
gilpetriloPJ
Não tem relação nenhuma com Date, por exemplo.
Como eu disse, é uma implementação com multiprogramação. E esta classe Relogio será o “clock” responsável pela sincronização das threads, já que se trata de um modelo síncrono.
Acho que isso não ajudou muito também… :roll:
C
carisioPJ
Posta o código completo da classe aqui. E posta a mensagem de erro do compilador tb, pra facilitar.
Como é que tu esta entando criar a instancia para esta classe, se for no construtor: relogio rel = criaInstancia();
se for apartir de outra classe: relogio rel = relogio.criaInstancia();
Se tu estiver criando a instancia de modo adequado, o problema provavelmente esta em uma parte do código que tu não postou aqui.
[]
G
gilpetriloPJ
O código é meio grande… ficaria meio inviável colocar aqui. Mas eu posso adiantar que eu tô tentando criar uma instância em outra classe (No) da seguinte maneira: Relogio batida= Relogio.criaInstancia();.
Mas o primeiro problema a ser resolvido é o erro no teste if do método criaInstancia() de Relogio.
// método estático para recuperar a instância da classe
public static Relogio criaInstancia()
{
if (instancia.equals(null))
{
instancia= new Relogio();
}
return instancia;
}
Sendo que existe uma variável instancia do tipo Relogio declarada no início da classe.
C
carisioPJ
instancia.equals(null) vai dar pai mesmo, pq qdo instancia for igual a null, equals não pode ser chamado nela…
O jeito certo é fazer (instancia == null)
Confere seu código nessa parte, pois na primeira mensagem estava certo, fazendo a comparação com ==.
[]'s
carisio
G
gilpetriloPJ
Na verdade eu havia tentado era == mesmo. Mas eu tentei equals() num momento de desespero para ver se poderia dar certo. Mas nenhum dos dois dá certo.
S
spierPJ
Olá,
vou insistir:
se o código é “meio grande”, dá pra considerar que este código tem mais de uma classe?
Este classe é inner (está dentro de uma outra classe) como por exemplo:
Neste tipo de construção, o construtor da clase “externa” poderá intervir na construção de Relogio.
Já tentou inicializar instancia na declaração?
private static Relogio relogio = new Relogio();
Se a classe é threadsafe, não teria problemas.
E por falar em threads (você falou aí em multiprogramação) como está a sincronização? Também neste caso, principalmente, a inicialização na declaração resolveria!
G
gilpetriloPJ
Desculpe a ausência. Mas eu voltei pra agradecer a ajuda de vcs. Suas dicas realmente me ajudaram muito.
Eu realmente estava usando a referência static instancia da maneira errada. Nem todos os lugares eu estava colocando da forma: