Olá, sou novo no fórum. Estou estudando a parte de jdbc antes de começar algo maior (como frameworks de ORM, etc.). Consegui me conectar e adicionar um registro no banco de dados (MYSQL 5.0.37), usando o JDK 1.5 Update 6 e o driver mysql connector 5.0.5. O problema é que quando eu tento fazer uma classe DAO, na hora de adicionar, ocorre uma NullPointerException. Só que o código pra adicionar É O MESMO que eu usava antes, pra conectar e adicionar, usando uma classe só! Vou colocar os códigos do “antes e depois”, pra se alguém puder, me corrija ou ajude:
ANTES
importjava.sql.*;publicclassTesteBD{publicstaticvoidmain(Stringargs[]){try{Connectionconexao=ConnectionFactory.getConnection();Contatoc=newContato();c.setNome("Fulano");c.setEndereco("Rua da casa dele");c.setIdade(19);c.setTelefone("[telefone removido]");c.setEmail("[email removido]");System.out.println("Contato criado");PreparedStatementstmt=conexao.prepareStatement("insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);");stmt.setString(1,c.getNome());stmt.setString(2,c.getEndereco());stmt.setInt(3,c.getIdade());stmt.setString(4,c.getTelefone());stmt.setString(5,c.getEmail());stmt.executeUpdate();stmt.close();System.out.println("Contato adicionado");}catch(SQLExceptione){e.printStackTrace();}}}
importjava.sql.*;publicclassTestaDAO{publicstaticvoidmain(Stringargs[]){try{Connectionconexao=ConnectionFactory.getConnection();Contatoc=newContato();c.setNome("Fulano");c.setEndereco("Rua da casa dele");c.setIdade(19);c.setTelefone("[telefone removido]");c.setEmail("[email removido]");System.out.println("Contato criado");ContatoDAOdao=newContatoDAO();dao.adiciona(c);}catch(Exceptione){e.printStackTrace();}}}
V
vinicius.ugf
Classe ContatoDAO
importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.PreparedStatement;publicclassContatoDAO{privateConnectionconexao;privatePreparedStatementstmt;publicvoidContatoDAO()throwsSQLException{this.conexao=ConnectionFactory.getConnection();}publicvoidadiciona(Contatocontato)throwsException{stmt=this.conexao.prepareStatement("insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);");stmt.setString(1,contato.getNome());stmt.setString(2,contato.getEndereco());stmt.setInt(3,contato.getIdade());stmt.setString(4,contato.getTelefone());stmt.setString(5,contato.getEmail());stmt.executeUpdate();stmt.close();}}
ConnectionFactory
importjava.sql.DriverManager;importjava.sql.Connection;importjava.sql.SQLException;publicclassConnectionFactory{privatestaticfinalStringdriver="com.mysql.jdbc.Driver";privatestaticfinalStringurl="jdbc:mysql://localhost:3306/agenda";privatestaticfinalStringuser="root";privatestaticfinalStringpass="";publicstaticConnectiongetConnection()throwsSQLException{try{Class.forName(driver);returnDriverManager.getConnection(url,user,pass);}catch(ClassNotFoundExceptione){thrownewSQLException("O driver jdbc não foi encontrado");}}}
V
vinicius.ugf
Obrigado pela ajuda.
Mauricio_Linhares
Qual é a linha e a classe da NullPointerException?
stmt = this.conexao.prepareStatement(“insert into contato (nome,endereco,idade,telefone,email) values (?,?,?,?,?);”);
joe_cqr
a sua classe ContatoDAO não está criando a conexão, pq o construtor está declarado como um método void, e isto não está deixando vc criar uma instancia da conexão, ai ela fica como null e gera a exceção NullPointerException
Caramba!!! Eu fiquei dias revendo o código! Esqueci que o void não deixa retornar nada!
O interessante é que quando eu testo pra ver se a conexão é !=null (fiz isso após postar aqui), ele retorna false, então não sei o que está na variável conexao (deve ser uma conexao vazia, sei lá).