[Resolvido]Erro de exceção na linha "AWT-EventQueue-0" java.lang.NullPointerException

Olá a todos!
Tenho iniciado um estudo sobre java com o framework Hibernate e tenho me empenhado fazendo testes e aprendendo tanto a linguagem Java como a documentação do Hibernate… Ainda que muito superficial.
Bem, em uma de minhas atividades onde tenho implementado um modelo dum sistema para uma gravadora de musicas, logo no início sofre com um erro que me parec muito pertinente. Talvez seja só uma coisinha e tal, mas tá me dando dor de cabeça :roll:
Pois bem, utilizando o Netbean criei uma interface básica para inserção, busca, etc no banco de dados. Porém, na hora em que clico em salvar aparece o seguinte na saída:

1 [AWT-EventQueue-0] INFO org.hibernate.cfg.annotations.Version - Hibernate Annotations 3.4.0.GA 12 [AWT-EventQueue-0] INFO org.hibernate.cfg.Environment - Hibernate 3.3.0.SP1 15 [AWT-EventQueue-0] INFO org.hibernate.cfg.Environment - loaded properties from resource hibernate.properties: {hibernate.pool_size=10, hibernate.connection.driver_class=com.mysql.jdbc.Driver, hibernate.dialect=org.hibernate.dialect.MySQLDialect, hibernate.format_sql=true, hibernate.connection.username=root, hibernate.hbm2ddl.auto=update, hibernate.connection.url=jdbc:mysql://localhost/prova3poo, hibernate.bytecode.use_reflection_optimizer=false, hibernate.show_sql=true, hibernate.connection.password=****} 17 [AWT-EventQueue-0] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist 23 [AWT-EventQueue-0] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling 80 [AWT-EventQueue-0] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.1.0.GA Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at br.prova3poo.thiago.dao.Dao.inserir(Dao.java:22) at br.prova3poo.thiago.visao.VisaoCantor.jBSalvarActionPerformed(VisaoCantor.java:247) at br.prova3poo.thiago.visao.VisaoCantor.access$100(VisaoCantor.java:24) at br.prova3poo.thiago.visao.VisaoCantor$2.actionPerformed(VisaoCantor.java:168) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) at java.awt.Component.processMouseEvent(Component.java:6203) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:5968) at java.awt.Container.processEvent(Container.java:2105) at java.awt.Component.dispatchEventImpl(Component.java:4564) at java.awt.Container.dispatchEventImpl(Container.java:2163) at java.awt.Component.dispatchEvent(Component.java:4390) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055) at java.awt.Container.dispatchEventImpl(Container.java:2149) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4390) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) at java.awt.EventQueue.access$000(EventQueue.java:96) at java.awt.EventQueue$1.run(EventQueue.java:608) at java.awt.EventQueue$1.run(EventQueue.java:606) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) at java.awt.EventQueue$2.run(EventQueue.java:622) at java.awt.EventQueue$2.run(EventQueue.java:620) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) CONSTRUÍDO COM SUCESSO (tempo total: 22 minutos 27 segundos)

Justamente guando eu aciono o botão salvar associado ao evento jBSalvarActionPerformed implementado desta forma:

[code] private void jBSalvarActionPerformed(java.awt.event.ActionEvent evt) {

        Cantor cantor=new Cantor();

        cantor.setNome(jTNome.getText());
        cantor.setCpf(jTCpf.getText());
        cantor.setRg(jTRg.getText());
        cantor.setEmail(jTEmail.getText());

        Dao<Cantor> dao = new Dao<Cantor>();

        dao.inserir(cantor);

        JOptionPane.showMessageDialog(null, "Dados gravados com sucesso!");
        dao.fechar();
       
}

[/code]

Além disso, tenho percebido que o erro faz referência a classe Dao que você pode ver logo abaixo:

[code]public class Dao {
private Session sessao=HibernateUtilidades.getSessoes();

public void inserir(T tipo) {
    
    sessao.beginTransaction();
    sessao.save(tipo);
    sessao.getTransaction().commit();
}

public void fechar(){
    sessao.close();
}

public void atualizar(T t){
    sessao.beginTransaction();
sessao.update(t);
sessao.getTransaction().commit();
}

public void deletar(T t){
    sessao.beginTransaction();
    sessao.delete(t);
    sessao.getTransaction().commit();
}

public List recuperarTodos(T t){
    return sessao.createQuery("from " + t.getClass().getName()).list();
}

}[/code]

E acho que seria importante verificar a classe encarregada de carregar as tabelas (classes) no BD:

[code]public class HibernateUtilidades {

private static AnnotationConfiguration configAnotacoes = new AnnotationConfiguration();
private static Session sessoes;

public static void atualizaSchema(){

    getConfigAnotacoes().addAnnotatedClass(br.prova3poo.thiago.modelo.Cantor.class);
    getConfigAnotacoes().addAnnotatedClass(br.prova3poo.thiago.modelo.Compositor.class);
    getConfigAnotacoes().addAnnotatedClass(br.prova3poo.thiago.negocio.Gravadora.class);
    getConfigAnotacoes().addAnnotatedClass(br.prova3poo.thiago.negocio.Musica.class);

    SchemaExport export = new SchemaExport(getConfigAnotacoes());
    export.create(true, true);
    sessoes = getConfigAnotacoes().buildSessionFactory().openSession();
}


public static AnnotationConfiguration getConfigAnotacoes() {
    return configAnotacoes;
}

public static Session getSessoes() {
    return sessoes;
}

}
[/code]

E como ponto de partida deixo a baixo o esquema geral desse projeto abaixo pra você observar:

Finalmente resta minhas dúvidas: O que está errado? Como posso solucionar esse problema?
Agradeço desde já quem puder me ajudar!

java.lang.NullPointerException acontece quando você chama algo que ainda não foi criado,verifique se vocẽ esta chamando algum objeto sem ter criado.

Esse erro ocorre quando você tenta invocar um método ou acessar o campo de uma referência com valor null. No seu código, provavelmente a variável sessao do seu Dao está nula, isso porque ela deve estar nula na sua classe HibernateUtilidades. Chame o método atualizaSchema da sua classe HibernateUtilidades e provavelmente vai funcionar. Agora, já adiantando, manter uma classe com variáveis estáticas vai te dar dor de cabeça ao trabalhar com multi-thread.

Não entendi, como você pode ver na classe HibernateUtilidades a variável “sessoes” recebe configAnotacoes.buildSessionFactory().openSession(); e o getSessoes está referenciado na variável sessao da classe Dao que retorna o objeto do tipo Session já configurado na classe HibernateUtilidades. Então eu não sei o que pode tá dando errado na classe Dao… E também não vejo erro na classe onde chamei o método “inserir”. Certo, que existem certas variáveis estáticas na classe HibernateUtilidades, mas não sei outro jeito de manter esse código de outra forma mesmo que estou apenas aprendendo.
Obrigado pela resposta!
Por favor não deixe de me corresponder também…
Até!

De certeza que algo está null. Provavelmente sessao. Usa o debugger do IDE para descobrir o que.

Ok eu usei o depurador (debugger) para executar a classe da interface de cadastro de usuários e notei mais uma informação de erro que acontece no momento em que se tenta executar a linha
sessao.beginTransaction(); do método “inserir” da classe Dao:

[color=green]/Console do depurador/[/color]
Ouvindo em 36432
[color=red]Não foi possível enviar o ponto de interrupção LineBreakpoint Dao.java : 17, razão: O ponto de interrupção está configurado fora de qualquer classe.[/color]
[color=blue]Inválido LineBreakpoint Dao.java : 17[/color]
Executando programa do usuário
Depurador interrompido em código-fonte não compilável.
Programa do usuário finalizado

Não entendi, como você pode ver na classe HibernateUtilidades a variável “sessoes” recebe configAnotacoes.buildSessionFactory().openSession(); e o getSessoes está referenciado na variável sessao da classe Dao que retorna o objeto do tipo Session já configurado na classe HibernateUtilidades. Então eu não sei o que pode tá dando errado na classe Dao… E também não vejo erro na classe onde chamei o método “inserir”. Certo, que existem certas variáveis estáticas na classe HibernateUtilidades, mas não sei outro jeito de manter esse código de outra forma mesmo que estou apenas aprendendo.
Obrigado pela resposta!
Por favor não deixe de me corresponder também…
Até![/quote]

Acredite em mim, a variável sessao do Dao não está sendo configurada da maneira que você pensa. O fato é que em HibernateUtilidades a variável sessoes somente é configurada se você chamar atualizaSchema antes, e no tratamento do evento você não faz essa chamada. Você até pode fazer essa chamada na criação do Dao, mas como a variável é estática ela pode ser anulada em qualquer ponto do programa. Como a variável em HibernateUtilidades é nula, então o valor null é passado pro Dao, de forma que quando ele tentar usar vai ocorrer a exceção.

Quanto ao erro do debug, na boa, ninguém tem bola de cristal pra adivinhar qual a IDE que você está usando. Mas pela mensagem, é provável que nem compilando a classe esteja. Certifique-se que as configurações do compilador estejam marcada para gerar informação de debug, dê um clean e depois um build all, se tudo compilar, tente novamente.

Não entendi, como você pode ver na classe HibernateUtilidades a variável “sessoes” recebe configAnotacoes.buildSessionFactory().openSession(); e o getSessoes está referenciado na variável sessao da classe Dao que retorna o objeto do tipo Session já configurado na classe HibernateUtilidades. Então eu não sei o que pode tá dando errado na classe Dao… E também não vejo erro na classe onde chamei o método “inserir”. Certo, que existem certas variáveis estáticas na classe HibernateUtilidades, mas não sei outro jeito de manter esse código de outra forma mesmo que estou apenas aprendendo.
Obrigado pela resposta!
Por favor não deixe de me corresponder também…
Até![/quote]

Acredite em mim, a variável sessao do Dao não está sendo configurada da maneira que você pensa. O fato é que em HibernateUtilidades a variável sessoes somente é configurada se você chamar atualizaSchema antes, e no tratamento do evento você não faz essa chamada. Você até pode fazer essa chamada na criação do Dao, mas como a variável é estática ela pode ser anulada em qualquer ponto do programa. Como a variável em HibernateUtilidades é nula, então o valor null é passado pro Dao, de forma que quando ele tentar usar vai ocorrer a exceção.

Quanto ao erro do debug, na boa, ninguém tem bola de cristal pra adivinhar qual a IDE que você está usando. Mas pela mensagem, é provável que nem compilando a classe esteja. Certifique-se que as configurações do compilador estejam marcada para gerar informação de debug, dê um clean e depois um build all, se tudo compilar, tente novamente.[/quote]

Ok, mas ainda não entendi o que vc quer dizer ainda… Suponho que eu poderia resolver abrindo uma sessão antes de iniciar a transação na classe Dao? Assim:

[code]public class Dao {

/Aqui o variavel “sessao” recebe configAnotacoes.buildSessionFactory().openSession();/
private Session sessao = HibernateUtilidades.getSessoes();

public void inserir(T tipo) {     
    getSessao();
    getSessao().beginTransaction();
    getSessao().save(tipo);
    getSessao().getTransaction().commit();
}

public Session getSessao() {
return sessao;
}
[/code]

Ah! E sobre o erro do debugger, estou usando o Netbean como havia dito antes… Mas o código da interface executa normal, sem erros, apenas não funciona quando é acionado algum método da classe Dao até então… E foi devido isso que apareceu aquele erro do depurador.

Até mais!

Não entendi, como você pode ver na classe HibernateUtilidades a variável “sessoes” recebe configAnotacoes.buildSessionFactory().openSession(); e o getSessoes está referenciado na variável sessao da classe Dao que retorna o objeto do tipo Session já configurado na classe HibernateUtilidades. Então eu não sei o que pode tá dando errado na classe Dao… E também não vejo erro na classe onde chamei o método “inserir”. Certo, que existem certas variáveis estáticas na classe HibernateUtilidades, mas não sei outro jeito de manter esse código de outra forma mesmo que estou apenas aprendendo.
Obrigado pela resposta!
Por favor não deixe de me corresponder também…
Até![/quote]

Acredite em mim, a variável sessao do Dao não está sendo configurada da maneira que você pensa. O fato é que em HibernateUtilidades a variável sessoes somente é configurada se você chamar atualizaSchema antes, e no tratamento do evento você não faz essa chamada. Você até pode fazer essa chamada na criação do Dao, mas como a variável é estática ela pode ser anulada em qualquer ponto do programa. Como a variável em HibernateUtilidades é nula, então o valor null é passado pro Dao, de forma que quando ele tentar usar vai ocorrer a exceção.

Quanto ao erro do debug, na boa, ninguém tem bola de cristal pra adivinhar qual a IDE que você está usando. Mas pela mensagem, é provável que nem compilando a classe esteja. Certifique-se que as configurações do compilador estejam marcada para gerar informação de debug, dê um clean e depois um build all, se tudo compilar, tente novamente.[/quote]

Ok, mas ainda não entendi o que vc quer dizer ainda… Suponho que eu poderia resolver abrindo uma sessão antes de iniciar a transação na classe Dao? Assim:

[code]public class Dao {

/Aqui o variavel “sessao” recebe configAnotacoes.buildSessionFactory().openSession();/
private Session sessao = HibernateUtilidades.getSessoes();

public void inserir(T tipo) {     
    getSessao();
    getSessao().beginTransaction();
    getSessao().save(tipo);
    getSessao().getTransaction().commit();
}

public Session getSessao() {
return sessao;
}
[/code]

Ah! E sobre o erro do debugger, estou usando o Netbean como havia dito antes… Mas o código da interface executa normal, sem erros, apenas não funciona quando é acionado algum método da classe Dao até então… E foi devido isso que apareceu aquele erro do depurador.

Até mais!
[/quote]

Isso não resolve, pois é uma atribuição vazia. O que você não está entendendo é que a sessão já está nula desde a classe HibernateUtilidades. Na boa, acho que o melhor que você faz é estudar a apostila de Java Básico FJ-11 da Caelum antes de partir para código com GUI e Hibernate, pois o erro que está acontecendo é básico, e não está diretamente relacionado com persistência.

Não entendi, como você pode ver na classe HibernateUtilidades a variável “sessoes” recebe configAnotacoes.buildSessionFactory().openSession(); e o getSessoes está referenciado na variável sessao da classe Dao que retorna o objeto do tipo Session já configurado na classe HibernateUtilidades. Então eu não sei o que pode tá dando errado na classe Dao… E também não vejo erro na classe onde chamei o método “inserir”. Certo, que existem certas variáveis estáticas na classe HibernateUtilidades, mas não sei outro jeito de manter esse código de outra forma mesmo que estou apenas aprendendo.
Obrigado pela resposta!
Por favor não deixe de me corresponder também…
Até![/quote]

Acredite em mim, a variável sessao do Dao não está sendo configurada da maneira que você pensa. O fato é que em HibernateUtilidades a variável sessoes somente é configurada se você chamar atualizaSchema antes, e no tratamento do evento você não faz essa chamada. Você até pode fazer essa chamada na criação do Dao, mas como a variável é estática ela pode ser anulada em qualquer ponto do programa. Como a variável em HibernateUtilidades é nula, então o valor null é passado pro Dao, de forma que quando ele tentar usar vai ocorrer a exceção.

Quanto ao erro do debug, na boa, ninguém tem bola de cristal pra adivinhar qual a IDE que você está usando. Mas pela mensagem, é provável que nem compilando a classe esteja. Certifique-se que as configurações do compilador estejam marcada para gerar informação de debug, dê um clean e depois um build all, se tudo compilar, tente novamente.[/quote]

Ok, mas ainda não entendi o que vc quer dizer ainda… Suponho que eu poderia resolver abrindo uma sessão antes de iniciar a transação na classe Dao? Assim:

[code]public class Dao {

/Aqui o variavel “sessao” recebe configAnotacoes.buildSessionFactory().openSession();/
private Session sessao = HibernateUtilidades.getSessoes();

public void inserir(T tipo) {     
    getSessao();
    getSessao().beginTransaction();
    getSessao().save(tipo);
    getSessao().getTransaction().commit();
}

public Session getSessao() {
return sessao;
}
[/code]

Ah! E sobre o erro do debugger, estou usando o Netbean como havia dito antes… Mas o código da interface executa normal, sem erros, apenas não funciona quando é acionado algum método da classe Dao até então… E foi devido isso que apareceu aquele erro do depurador.

Até mais!
[/quote]

Agora eu compreendi o que você disse, realmente devido o método atualizaSchema ser estático eu já devia ter chamado antes de passa o objeto para classe Dao, assim ele configurava e abria a sessão antes, como sempre deveria ser. Então, da forma como estava fazendo a classe Dao nunca iria funcionar mesmo.

Apenas adicionei o comando HibernateUtilidades.atualizaSchema no evento onde se cria o objeto cantor, e o botão inserir dados (salvar) persistiu normalmente no banco de dados.

[code] private void jBSalvarActionPerformed(java.awt.event.ActionEvent evt) {

        HibernateUtilidades.atualizaSchema();
        Cantor c = new Cantor();
        Endereco en = new Endereco();
        Dao <Cantor> dao = new Dao<Cantor>();


        en.setBairro(jTBairro.getText());
        en.setCep(jTCep.getText());
        en.setCidade(jTBairro.getText());
        en.setLogradouro(jTLogradouro.getText());
        en.setNumero(jTNumero.getText());
        
        c.setNome(jTNome.getText());
        c.setCpf(jTCpf.getText());
        c.setRg(jTRg.getText());
        c.setEmail(jTEmail.getText());

        c.setEndereco(en);

        dao.inserir(c);
        JOptionPane.showMessageDialog(null, "Dados gravados com sucesso!");
        dao.fechar();
       
}                                        

[/code]

Problema solucionado… Era tão simples e parecia tão longe pra mim…
Agora sim, próximo passo…

Valeu e Muito obrigado pela sua paciência e resposta! :smiley: