Erro java.lang.NullPointerException na linha PreparedStatement ps = con.prepareStat [Resolvido]
21 respostas
Q
queroaprender
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";try{Class.forName(driver);Connectioncon=null;con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}returnnull;}}
Esta dando erro de na linha do PreparedStatement ps = con.prepareStatement(“insert into table pessoa”); do código a seguir
java.lang.NullPointerException
o que tenho que criar antes para não dar o erro ali
e como faria para inserir o cod_cliente na tabela pessoa que ja existe no banco
packageDAO;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjavax.swing.JOptionPane;importConexao_banco.ConnectionFactory;publicclassClienteDAO{privateConnectioncon;publicvoidcadastraCliente(){try{con=ConnectionFactory.createConnection();PreparedStatementps=con.prepareStatement("insert into table pessoa");ResultSetrs=ps.executeQuery();if(rs.next()){System.out.println("Existe Registro");}ps.setString(1,"");ps.executeUpdate();Stringcod_cliente=JOptionPane.showInputDialog(null,"Informe o código: ");// ConnectionFactory.createConnection(). String sql = "insert into cod_cliente from pessoa where cod_cliente=" + cod_cliente;}catch(Exceptione){System.out.println("Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO");e.printStackTrace();}/* try { con.close(); } catch (SQLException e) { e.printStackTrace(); }*/}}
Repare q na linha 30 da classe ConnectionFactory vc está retornando null.
Faz o seguinte, faz a declaração do Connection antes do try, e ao invés de colocar “return null”, coloque “return con”.
E sua outra dúvida é como fazer um update da tabela pessoa, é isso?
Acho q é mais ou menos assim:
packageConexao_banco;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";Connectioncon=returncon;try{Class.forName(driver);con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}returnnull;}}
da erro ali na linha retornando só con.
G
Guilherme_Tsubauchi
cara, esse seu
Connectioncon=returncon;
no meio do fonte tá errado, se tu der um return, tu sai fora do método e tudo que tiver pra baixo não vai ser executado, never.
do jeito que tava antes tá certo, só o seu return lá em baixo que tá errado.
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";try{Class.forName(driver);Connectioncon=null;con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}// retorne aqui a conexão assim:returncon;// e não assim//return null ;}}
kvnallen
Cara essa linha:
PreparedStatementps=con.prepareStatement("insert into table pessoa"); ResultSetrs=ps.executeQuery(); if(rs.next()){System.out.println("Existe Registro"); }ps.setString(1,""); ps.executeUpdate();
O SQL está apenas INSERT INTO table pessoa , mas o que ele vai inserir? acho que faltou colocar (acho que é isso).
Pelo que conheço o comando é INSERT INTO tabela ('joao') values ('nome')
E pra inserir tenta assim:
try{Stringcod_cliente=JOptionPane.showInputDialog(null,"Informe o código: ");con=ConnectionFactory.createConnection();PreparedStatementps=con.prepareStatement("insert into table pessoa (NomeDaColunaNoBanco) values (?)");ResultSetrs=ps.executeQuery();if(rs.next()){System.out.println("Existe Registro");}ps.setString(1,cod_cliente);ps.executeUpdate();ps.close();rs.close();con.close();}
Q
queroaprender
packageDAO;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjavax.swing.JOptionPane;importConexao_banco.ConnectionFactory;publicclassClienteDAO{privateConnectioncon;publicvoidcadastraCliente(){try{Stringcod_cliente=JOptionPane.showInputDialog(null,"Informe o código: ");con=ConnectionFactory.createConnection();PreparedStatementps=con.prepareStatement("insert into table pessoa (cod_cliente) values (?)");ResultSetrs=ps.executeQuery();if(rs.next()){System.out.println("Existe Registro");}ps.setString(1,cod_cliente);ps.executeUpdate();ps.close();rs.close();con.close();}catch(Exceptione){System.out.println("Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO");e.printStackTrace();}}}
packageConexao_banco;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";try{Class.forName(driver);Connectioncon=null;con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}returnnull;}}
java.lang.NullPointerException
at DAO.ClienteDAO.cadastraCliente(ClienteDAO.java:22)
at Principal.Principal.main(Principal.java:36)Conexão realizada com sucesso.
Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO
o erro pode ser porque na tabela pessoa tem mais de uma coluna e eu estou tentando inserir so uma para teste?
nel
Pode ser.
O ideal é postar toda a stacktrace gerada, não somente o print que você mesmo realizou. Assim, podemos ter uma noção do que pode ser.
Q
queroaprender
java.lang.NullPointerException
at DAO.ClienteDAO.cadastraCliente(ClienteDAO.java:22)
at Principal.Principal.main(Principal.java:36)Conexão realizada com sucesso.
Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO
só da isso de erro
G
Guilherme_Tsubauchi
cara, primeiro resolve seu nullpointer,
para de retornar null na linha 32 do sua classe ConnectionFactory e começa a retornar a conexão.
NullPointerException significa que uma referência nula estava tentando executar uma determinada ação, como invocar algum método.
A linha 22 é essa:
PreparedStatementps=con.prepareStatement("insert into table pessoa (cod_cliente) values (?)");
Supondo que as linhas postadas seguem a da sua classe. Aposto que tu não conectou ao banco.
Ele apresenta essa mensagem: “Conexão realizada com sucesso” ?
Senão, é porque nem chegou a conectar, então precisas ver se as URL´s, usuário, senha e etc estão corretos e o banco, obviamente, está on.
nel
Guilherme Tsubauchi:
cara, primeiro resolve seu nullpointer,
para de retornar null na linha 32 do sua classe ConnectionFactory e começa a retornar a conexão.
ou seja, troca o seu
returnnull;
por
return con;
Nossa, não cheguei nem a ver que ele estava me dando um return null. Bem visto.
Q
queroaprender
packageConexao_banco;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{privatestaticConnectioncon;publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";try{Class.forName(driver);Connectioncon=null;con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}returncon;}}
E o que tu fez para tentar solucionar o problema ?
Eu dei uma dica ali em cima, leia ela.
G
Guilherme_Tsubauchi
meu jovem padawan…
você criou um objeto
privatestaticConnectioncon;
na linha 9.
ele não é inicializado em momento algum pelo seu método createConnection, mas ele é retornado pelo seu método.
Há 2 soluções possíveis:
Primeira:
Remova a linha 23 da sua classe ConnectionFactory.
Connectioncon=null;
Segunda:
Mova a linha 23 da sua classe para fora do bloco try{…} da sua classe e remova o objeto criado na linha 9.
Connectioncon=null;
F
felipeaps
Como o Guilherme disse, vc está criando 2 objetos Connection.
Um objeto de classe, e um local (dentro do try), porém o que vc está retornando é o de classe, que nunca foi inicializado.
Outra alternativa:
ao invés de:
Connectioncon=null;
Faça:
con=null;
Isso também deve funcionar.
Q
queroaprender
mas se eu removo dai não consegue conectar no banco da o erro
pode ser porque estou tentando inserir so uma coluna em uma tabela que tem mais colunas?
Creio que não tem nada a ver com tentar colocar valores em só uma coluna, o problema é antes disso.
Tenta assim:
packageConexao_banco;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassConnectionFactory{privatestaticConnectioncon;publicstaticConnectioncreateConnection()throwsSQLException{Stringdriver="org.postgresql.Driver";Stringuser="postgres";Stringsenha="postgres";Stringurl="jdbc:postgresql://localhost:5432/teste_dao";try{Class.forName(driver);con=null;con=DriverManager.getConnection(url,user,senha);System.out.println("Conexão realizada com sucesso.");returncon;}catch(ClassNotFoundExceptionex){System.err.print(ex.getMessage());}}}
Ve se funciona;
G
Guilherme_Tsubauchi
aí, vamo ao próximo erro.
Sua conexão foi feita com sucesso.
você cria um ps com aquele insert bacana ali, e no values tu coloca um (?).
na sequência tu manda executar o ps.
mas ele vai executar o insert com que parâmetro, se você só passa ele no final com o ps.setString(...)
é exatamente o que ele tá reclamando na exceção:
Nenhum valor especificado para parâmetro 1.
outra coisa, se tua tabela tem mais colunas, acho que tu vai ter que passar elas ali, caso elas não sejam nuláveis.
kvnallen
Guilherme Tsubauchi:
aí, vamo ao próximo erro.
Sua conexão foi feita com sucesso.
você cria um ps com aquele insert bacana ali, e no values tu coloca um (?).
na sequência tu manda executar o ps.
mas ele vai executar o insert com que parâmetro, se você só passa ele no final com o ps.setString(...)
é exatamente o que ele tá reclamando na exceção:
Nenhum valor especificado para parâmetro 1.
outra coisa, se tua tabela tem mais colunas, acho que tu vai ter que passar elas ali, caso elas não sejam nuláveis.
Pois é, acho que ele criou esse código pra verificar se tinha dados na tabela, mas acho que você só pode fazer isso com SELECT, remove o executeQuery(); e deixa apenas o executeUpdate();
Q
queroaprender
Consegui
ficou assim
packageDAO;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjavax.swing.JOptionPane;importConexao_banco.ConnectionFactory;publicclassClienteDAO{privateConnectioncon;publicvoidcadastraCliente(){try{intcod_cliente=Integer.parseInt(JOptionPane.showInputDialog(null,"Informe o código: "));con=ConnectionFactory.createConnection();PreparedStatementps=con.prepareStatement("insert into pessoa (cod_cliente) values (?)");ps.setInt(1,cod_cliente);ps.executeUpdate();ps.close();con.close();}catch(Exceptione){System.out.println("Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO");e.printStackTrace();}}}
Q
queroaprender
Obrigado todos que ajudaram, arrumando um pouco de um, um pouco de outro que consegui.
G
Guilherme_Tsubauchi
ae… agora edita seu tópico e adiciona o Resolvido.