Erro Irritante - "AWT-EventQueue-0" java.lang.NullPointerException

14 respostas
luiz.monteiro

Pessoal fiz uma classe bem simples com um form e um botao, o botao faz a inserção de campos no BD, ao clicar no botão aparece um erro estranho, e nao consigo resolver isso de jeito nenhum

CLASSE:

package cadastros;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import utilitarios.conexao;
public class teste extends javax.swing.JFrame {
    
    /** Creates new form teste */
    conexao con_cidade; 
    public teste() {
        initComponents();
        con_cidade = new conexao();
    }
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        btn_Salvar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        btn_Salvar.setText("salvar");
        btn_Salvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_SalvarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btn_Salvar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btn_Salvar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>                        

    private void btn_SalvarActionPerformed(java.awt.event.ActionEvent evt) {                                           
             try
     {    
               //---------- começa o procedimento gravação no banco-------------
               String sqlinsert ="insert into cidades (cidade,uf) values ('São Paulo','SP')";                                       
               con_cidade.statement.executeUpdate(sqlinsert);               
               dispose();
               JOptionPane.showMessageDialog(null,"Cidade Criada com Sucesso!");                                                            
     }
     catch (SQLException erro)
     {
	erro.printStackTrace();             
     }  
    }                                          
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new teste().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_Salvar;
    // End of variables declaration                   
    
}

ERRO:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at cadastros.teste.btn_SalvarActionPerformed(teste.java:50)
        at cadastros.teste.access$000(teste.java:6)
        at cadastros.teste$1.actionPerformed(teste.java:22)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

14 Respostas

Felagund

troque esse

por esse

/** Creates new form teste */
    conexao con_cidade; 
    public teste() {
        con_cidade = new conexao();
        initComponents();
    }

ele lança o nullpointer pq a variavel con_cidade, não foi inicializada. vc instancia ela somente depois que chama o initComponents, e nesse metodo vc utiliza a variavel con_cidade.

vc so tem q instanciar a variavel antes de chamar o initComponents

[]'s

LoveBozo

Con_cidade tá sendo inicializada depois da chamada a initComponents.

— edit —

Droga, Felagund postou antes =P

luiz.monteiro

bom pessoal mudei a ordem de con_cidade e o InitComponents e o erro continuou

saninaimayer

O outro erro possível de acontecer ai é em relação ao seu statement que pode não está sendo criado. Verifique na sua classe de conexão sobre isso.

Uma maneira interessante de se descobrir detalhes sobre o erro é tratar o erro com try catch e mandar imprimir o erro tratado. lembrando que esse tipo de erro de NullPointerException não deve acontecer no seu sistema pois caracteriza-se inconsistência no seu código.

Espero ajudar.

luiz.monteiro

Bem, acho difícil ser o Statement, pois tenho outra classe e ela salva normalmente, lembrando que esse erro só da quando eu salvo no BD, a leitura está funcionando perfeitamente.

Segue abaixo minha classe conexao para análise:

package utilitarios;
import java.sql.*;
import javax.swing.*;


public class conexao
{     
       // Conexao com o BD do MYSQL  ------------------------------------------
       //final private String url = "jdbc:mysql://localhost/chamados";
       //final private String driver = "com.mysql.jdbc.Driver";
       //final private String usuario = "xxxxxxx";
       //final private String senha = "xxxxxxxx";
       
       // Conexao com o BD do ACCESS ------------------------------------------
       final private String driver = "sun.jdbc.odbc.JdbcOdbcDriver";       
       final private String url = "jdbc:odbc:chamados";
       final private String usuario = "";
       final private String senha = "";
       //----------------------------------------------------------------------
       
       private Connection conexao;
       public Statement statement;
       public ResultSet resultset;

      public boolean conecta()
       {
            boolean result = true;
            try 
            {
                Class.forName(driver);
                conexao = DriverManager.getConnection(url, usuario, senha);
                //JOptionPane.showMessageDialog(null,"conectou");
            }
            catch(ClassNotFoundException Driver) 
            {
               JOptionPane.showMessageDialog(null,"Driver não localizado: "+Driver);
               result = false;
            }
            catch(SQLException Fonte) 
            {
                JOptionPane.showMessageDialog(null,"Deu erro na conexão "+
                        "com a fonte de dados: "+Fonte);
                result = false;
            }
            return result; 
       }
       
       public void desconecta()
       {
            boolean result = true;
            try 
            {
                conexao.close();
                JOptionPane.showMessageDialog(null,"banco fechado");
            }
            catch(SQLException fecha) 
            {
                JOptionPane.showMessageDialog(null,"Não foi possivel "+
                        "fechar o banco de dados: "+fecha);
                result = false;
            }

       }
       
       public void executeSQL(String sql)
       {
            try 
            {
                statement = conexao.createStatement(
                        ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
                resultset = statement.executeQuery(sql);
            }
            catch(SQLException sqlex) 
            {
               JOptionPane.showMessageDialog(null,"Não foi possível "+
                       "executar o comando sql,"+sqlex+", o sql passado foi "+sql);
            }

       }
       
}
vinidiax

tenta inicializar a conexão apenas quando o seu botao salvar for acionado, coloque conexao con_cidade = new conexao(); dentro do teu metodo btn_SalvarActionPerformed(java.awt.event.ActionEvent evt)

saninaimayer

Bem, a sua leitura está funcionando perfeitamente pois o seu statement está sendo iniciado quando vc executa o seu método executeSQL(query) da sua classe Conexao. Eu não vi em nenhum outro lugar o seu statement sendo iniciado.

luiz.monteiro

vinidiax ,
já tentei isso também, instanciei e inicializei dentro do método, mas o problema continua, esse erro ta muito bizarro.

lcegatti

O problema é o seu statement que vc tenta acessar e está nullo, vc precisa inicializar seu statement, tente inserir este construtor na sua classe conexao:

public conexao() {
  conecta();
}

E tente iserir esta linha no método conecta

conexao = DriverManager.getConnection(url, usuario, senha);
 statement = conexao.createStatement();

[]'s

vinidiax

eu uso o seguinte metodo para conexao e nunca deu erro:

public void armazenaCadastroMarcas (Marcas objeto){

Connection con = null;

try

{

// Este é um dos meios para registrar um driver

String driverName = org.postgresql.Driver;

Class.forName(driverName);
String serverName = servidor;
         String mydatabase = "luguipi";
         String url = "jdbc:postgresql://" + serverName +  "/" + mydatabase;
         String username = "postgres";
         String password = "postgres";
        
         //Query passando o objeto cliente para armazernar no banco
         
         String sql = "INSERT INTO marcas_produtos(id_marca,nome) VALUES (default,'"+objeto.getNome()+"')";
         
         //fim da query
         con = DriverManager.getConnection(url, username, password);             
         PreparedStatement pstm = con.prepareStatement(sql);             
         pstm.executeQuery();
         pstm.close();
         
         con.close();
     } 
    catch (ClassNotFoundException ex) {
        Logger.getLogger(Metodos.class.getName()).log(Level.SEVERE, null, ex);
    }         catch(SQLException e) 
     { 
         // se houve algum erro, uma exceção é gerada para informar o erro 
         e.printStackTrace(); //vejamos que erro foi gerado e quem o gerou 
     } 
     finally 
     { 
        try 
        { 
           con.close(); 
           
        } 
        catch(SQLException onConClose) 
        { 
            System.out.println("Houve erro no fechamento da conexão"); 
            onConClose.printStackTrace(); 
        } 
     } // fim do bloco try-catch-finally 
}
luiz.monteiro

lcegatti e saninaimayer, inicializo meu statement no método executeSQL, mas fiz tbm como vcs sugeriram e nada funfou

lcegatti

Só lembrando que com aquelas alterações a ordem deve ser a surgerida pelo Felagund.

Segundo a sua exception o erro ocorre aqui:

con_cidade.statement.executeUpdate(sqlinsert);

O que está nullo é o statement, e antes desta instrução vc não chamou o executaSQL, o correto segundo o seu códgo não seria:

con_cidade.executeSQL(sqlinsert); ??

[]'s

vinidiax

concordo com os amigos acima, e tbm se meus olhos nao falharam, nao vi no codigo o con_cidade.conecta();

luiz.monteiro

Bom Galera , FUNCIONOU!!! OBRIGADO DE CORAÇÃO!!!

Solução para os futuros desesperados hehehehe:

1 - esqueci de inicializar na classe teste o método con_cidade.conecta()

2 - na classe conexao só funcionou depois que no método conecta() inicializei o statement
statement = conexao.createStatement();

Abraços para todos!!
LP

Criado 20 de agosto de 2008
Ultima resposta 20 de ago. de 2008
Respostas 14
Participantes 6