Erro de NullPointerException

4 respostas
adrianoseven

Amigos, tenho uma dúvida que deve ser bem simples de se resolver, mas não estou conseguindo identificar o problema.
É o seguinte. Tenho 3 classes: A main, Pessoa e o DAO. O objetivo do programa é receber um nome e adiciona-lo ao banco de dados. Criei estas 3 classes mas não consigo identificar esse erro de NullPointerException.
Segue abaixo minhas 3 classes.

CLASSE PESSOA.JAVA
package testedao;

public class Pessoa {
    
    private String nome;
    private DAO db= new DAO();
    
    public Pessoa() {
    }
    
    public String getNome(){
        return nome;
    }
    public void setNome(String nome){
        this.nome=nome;
    }
    
    //Metodo passa tabelas e campos para DAO inserir no Banco
    public void inserePessoa(){
        
        //PREPARA OS DADOS PARA O DAO
        String tb, cps, vals;
        tb= "pessoa";
        cps= "(nome)";
        vals= "('"+nome+"')";
        db.insere(tb, cps, vals);
        
    }
}
CLASSE DAO.JAVA
package testedao;
import java.sql.*;

public class DAO {
    
    Connection con;
    Statement st;
    ResultSet res;
    int upd;
    StringBuilder msg= new StringBuilder();
  
    public DAO() {
    }
    
    public void conecta(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            con= DriverManager.getConnection("jdbc:mysql://localhost/teste","root","123");
            st= con.createStatement();
            
        }catch(ClassNotFoundException e){
            msg.append("Erro Driver");
        }
        catch(SQLException e){
            msg.append("Não conectou no banco");
        }
    } // FIM CONECTA
    
    public void insere(String tb, String campos, String vals){
        conecta();
        try{
        String q= "insert into "+tb+" "+campos+ " values "+ vals;
        
        //Executar o SQL
        upd= st.executeUpdate(q);
        
        // Teste do banco
        if (upd!=0)
            msg.append("Insercao OK!");
        else
            msg.append("Erro: Insercao");
        }catch(SQLException e){
            msg.append("Erro: SQL insercao");
        }
        desconecta();
    }// FIM INSERE
    
    public void desconecta(){
        try{
            con.close();
        }catch(SQLException e){
            msg.append("Erro Desconecta");
        }
    } // FIM DESCONECTA
    
    //RETORNAR MENSAGENS
    public String getMsg(){
        return msg.toString();
    }
}
CLASSE MAIN
package testedao;

public class Main {
    
  
    public Main() {
    }
    
    public static void main(String[] args) {
        
        Pessoa p= new Pessoa(); 

        //Insere um nome

        p.setNome("Vitor");
        System.out.println("Nome retornado: "+ p.getNome());
        p.inserePessoa();
        
    }
    
}
Erro que é infomado ao compilar:
init:
deps-jar:
Compiling 3 source files to C:\Documents and Settings\Negrão\TesteDAO\build\classes
compile:
run:
Nome retornado: Vitor
Exception in thread "main" java.lang.NullPointerException
        at testedao.DAO.insere(DAO.java:44)
        at testedao.Pessoa.inserePessoa(Pessoa.java:36)
        at testedao.Main.main(Main.java:23)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)

A Linha 44 da Classe DAO é o : upd= set.executeUpdate(q);

Vlw

4 Respostas

E

Rapa assim fica meio complicado dizer oq eh, deve ser alguma coisa com a conexão, depura com alguma ferramenta ou através de Sysout.

peczenyj

Pense no seguinte:

Vc tem q conectar no banco de dados para poder inserir o dado, correto?

Se vc não consegue conectar, nem deveria tentar inserir, ja deveria abordar a ação por meio de uma exception adequada em algum momento da sua aplicação. Vc simplesmente guarda as mensagens de erro.

Sugestões:

  • Repense seus try/catch’s com base no que eu te disse (lembre-se q existe o finally tb);
  • Retire o codigo sql obtido através de concatenação de strings (PreparedStatement)
  • Pense em testes unitários (junit)
  • Use um logger decente (log4j)
adrianoseven

Eu uso o NETBEANS e ele está achando o mysql e conectando na boa quando o configurei…

Vcs tem uma dica de uma maneira mais simples q essa de testar a conexão com o Banco?

psandrelli

Na sua classe DAO, no método desconecta(), faz um teste pra saber se seu objeto “con” está null.

public void desconecta(){  
     try{  
          if (con != null) {
            con.close();  
          }
        }catch(SQLException e){  
            msg.append("Erro Desconecta");  
        }  
    } // FIM DESCONECTA
Criado 13 de janeiro de 2008
Ultima resposta 14 de jan. de 2008
Respostas 4
Participantes 4