Erro java.lang.NullPointerException na linha PreparedStatement ps = con.prepareStat [Resolvido]

21 respostas
Q
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	public static Connection createConnection() throws SQLException{
	 
    
        String driver = "org.postgresql.Driver";  
        String user   = "postgres";  
        String senha  = "postgres";  
        String url    = "jdbc:postgresql://localhost:5432/teste_dao";  
  
        try  
        {  
        	     		        
            Class.forName(driver);  
            Connection con = null;  
  
            con = DriverManager.getConnection(url, user, senha);  
            System.out.println("Conexão realizada com sucesso.");
            
                    
                        
        }  
        catch (ClassNotFoundException ex)          {  
            System.err.print(ex.getMessage());  
        }
		return null;   
         
    }
}

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

package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JOptionPane;

import Conexao_banco.ConnectionFactory;

public class ClienteDAO {
	
	private Connection con;

	public void cadastraCliente() {
		
		
		try {
			 con = ConnectionFactory.createConnection();
			 PreparedStatement ps = con.prepareStatement("insert into table pessoa");
			 ResultSet rs = ps.executeQuery();
			  if (rs.next()){
				System.out.println("Existe Registro");
			  }

			  ps.setString(1, "");
			  
			  ps.executeUpdate();
		     		
			String cod_cliente = JOptionPane.showInputDialog(null, "Informe o código: ");
          //  ConnectionFactory.createConnection(). String sql = "insert into cod_cliente from pessoa where cod_cliente=" + cod_cliente;
		   }  
		   catch(Exception e) {  
		      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();
			}*/
						   
	}  
				
}

21 Respostas

Andersonrms

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:

update pessoa set cod_cliente = <cod_cliente> where id = <id>

Vê se da certo.

Q
package Conexao_banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	public static Connection createConnection() throws SQLException{
	 
    
        String driver = "org.postgresql.Driver";  
        String user   = "postgres";  
        String senha  = "postgres";  
        String url    = "jdbc:postgresql://localhost:5432/teste_dao";  
  
        Connection con = return con;  
        
        try  
        {  
        	     		        
            Class.forName(driver);  
            
  
            con = DriverManager.getConnection(url, user, senha);  
            System.out.println("Conexão realizada com sucesso.");
            
                    
                        
        }  
        catch (ClassNotFoundException ex)          {  
            System.err.print(ex.getMessage());  
        }
		return null;   
         
    }
}

da erro ali na linha retornando só con.

G

cara, esse seu

Connection con = return con;

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.

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLException;  
  
public class ConnectionFactory {  
  
    public static Connection createConnection() throws SQLException{  
       
      
        String driver = "org.postgresql.Driver";    
        String user   = "postgres";    
        String senha  = "postgres";    
        String url    = "jdbc:postgresql://localhost:5432/teste_dao";    
    
        try    
        {    
                                  
            Class.forName(driver);    
            Connection con = null;    
    
            con = DriverManager.getConnection(url, user, senha);    
            System.out.println("Conexão realizada com sucesso.");  
              
                      
                          
        }    
        catch (ClassNotFoundException ex)          {    
            System.err.print(ex.getMessage());    
        }  

// retorne aqui a conexão assim:
        return con ;     
// e não assim
        //return null ;
           
    }  
}
kvnallen

Cara essa linha:

PreparedStatement ps = con.prepareStatement("insert into table pessoa");  
             ResultSet rs = 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 {  
  String cod_cliente = JOptionPane.showInputDialog(null, "Informe o código: ");             
  con = ConnectionFactory.createConnection();  
             PreparedStatement ps = con.prepareStatement("insert into table pessoa (NomeDaColunaNoBanco) values (?)");  
             ResultSet rs = ps.executeQuery();  
              if (rs.next()){  
                System.out.println("Existe Registro");  
              }  
  
              ps.setString(1, cod_cliente);  
                
              ps.executeUpdate();  
              ps.close();
              rs.close();
              con.close();
                      
        
           }
Q
package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JOptionPane;

import Conexao_banco.ConnectionFactory;

public class ClienteDAO {
	
	private Connection con;

	public void cadastraCliente() {
		
		
		try {
			 
			String cod_cliente = JOptionPane.showInputDialog(null, "Informe o código: ");               
			con = ConnectionFactory.createConnection();    
			           PreparedStatement ps = con.prepareStatement("insert into table pessoa (cod_cliente) values (?)");    
			           ResultSet rs = ps.executeQuery();    
			            if (rs.next()){    
			              System.out.println("Existe Registro");    
			            }    
			  
			            ps.setString(1, cod_cliente);    
			                
			            ps.executeUpdate();    
			            ps.close();  
			            rs.close();  
			            con.close();  
			            
		}			            
			            catch(Exception e) {  
			  		      System.out.println ("Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO");
			  		      e.printStackTrace();
		}              
	}
}
package Conexao_banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	public static Connection createConnection() throws SQLException{
	 
    
        String driver = "org.postgresql.Driver";  
        String user   = "postgres";  
        String senha  = "postgres";  
        String url    = "jdbc:postgresql://localhost:5432/teste_dao";  
  
        try  
        {  
        	     		        
            Class.forName(driver);  
            Connection con = null;  
  
            con = DriverManager.getConnection(url, user, senha);  
            System.out.println("Conexão realizada com sucesso.");
            
                    
                        
        }  
        catch (ClassNotFoundException ex)          {  
            System.err.print(ex.getMessage());  
        }
		return null;   
         
    }
}
package Principal;

import javax.swing.JOptionPane;

import DAO.ClienteDAO;

public class Principal {
	
	static Cliente cliente = new Cliente();
	static ClienteDAO cDao = new ClienteDAO();
	
	public static void main(String[] args) {
		   
		   int opcao;
		   String menu;
		  
		   
		    menu =  "Carlinhos Motos\n";
		    menu += "1  - Cadastro de Clientes\n";
		    menu += "8  - Aterar Cliente\n";
		    menu += "11 - Excluir Cliente\n";
		    menu += "14 - Listar Cliente\n";   
		    menu += "0  - Sair\n";
		        
		    do {

		      opcao = Integer.parseInt(JOptionPane.showInputDialog(menu));
		      
		      if (opcao == 0){
		        break;
		      }
		      
		      switch(opcao) {
		      
		      case 1:
		    	  cDao.cadastraCliente();
					break;
	       		      
		      		    
		    case 2:
		    //	  consultarCliente();
					break;
	       		      
		      }
		      
		            
		    } while (opcao != 0);
		    
		    System.exit(0);
		    
		 }
	
	
	
	}

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

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

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

return null;

por

return con;
nel

Essas duas linhas são essenciais:

java.lang.NullPointerException 
at DAO.ClienteDAO.cadastraCliente(ClienteDAO.java:22)

NullPointerException significa que uma referência nula estava tentando executar uma determinada ação, como invocar algum método.
A linha 22 é essa:

PreparedStatement ps = 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

return null;

por

return con;

Nossa, não cheguei nem a ver que ele estava me dando um return null. Bem visto.

Q
package Conexao_banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	private static Connection con;

	public static Connection createConnection() throws SQLException{
	 
    
        String driver = "org.postgresql.Driver";  
        String user   = "postgres";  
        String senha  = "postgres";  
        String url    = "jdbc:postgresql://localhost:5432/teste_dao";  
  
        try  
        {  
        	     		        
            Class.forName(driver);  
            Connection con = null;  
  
            con = DriverManager.getConnection(url, user, senha);  
            System.out.println("Conexão realizada com sucesso.");
            
                    
                        
        }  
        catch (ClassNotFoundException ex)          {  
            System.err.print(ex.getMessage());  
        }
		
		return con;   
         
    }
}
Mesmo erro

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
nel

E o que tu fez para tentar solucionar o problema ?
Eu dei uma dica ali em cima, leia ela.

G

meu jovem padawan…

você criou um objeto

private static Connection con;

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.

Connection con = 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.

Connection con = null;
F

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:

Connection con = null;

Faça:

con = null;

Isso também deve funcionar.

Q

mas se eu removo dai não consegue conectar no banco da o erro

Conexão realizada com sucesso.

Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO

org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 1.

at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:178)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:246)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)

at DAO.ClienteDAO.cadastraCliente(ClienteDAO.java:23)

at Principal.Principal.main(Principal.java:36)

pode ser porque estou tentando inserir so uma coluna em uma tabela que tem mais colunas?

F

queroaprender:
mas se eu removo dai não consegue conectar no banco da o erro

Conexão realizada com sucesso.

Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO

org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 1.

at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:178)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:246)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)

at DAO.ClienteDAO.cadastraCliente(ClienteDAO.java:23)

at Principal.Principal.main(Principal.java:36)

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:

package Conexao_banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {

	private static Connection con;

	public static Connection createConnection() throws SQLException{
	 
    
        String driver = "org.postgresql.Driver";  
        String user   = "postgres";  
        String senha  = "postgres";  
        String url    = "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.");
            
            return con;       
                        
        }  
        catch (ClassNotFoundException ex)          {  
            System.err.print(ex.getMessage());  
        }         
    }
}

Ve se funciona;

G

aí, vamo ao próximo erro.
Sua conexão foi feita com sucesso.

Seu problema agora é aqui:

PreparedStatement ps = con.prepareStatement("insert into table pessoa (cod_cliente) values (?)");      
                       ResultSet rs = ps.executeQuery();      
                        if (rs.next()){      
                          System.out.println("Existe Registro");      
                        }      
                
                        ps.setString(1, cod_cliente);

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.

Seu problema agora é aqui:

PreparedStatement ps = con.prepareStatement("insert into table pessoa (cod_cliente) values (?)");      
                       ResultSet rs = ps.executeQuery();      
                        if (rs.next()){      
                          System.out.println("Existe Registro");      
                        }      
                
                        ps.setString(1, cod_cliente);

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

Consegui

ficou assim

package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JOptionPane;

import Conexao_banco.ConnectionFactory;

public class ClienteDAO {
	
	private Connection con;

	public void cadastraCliente() {
		
		
		try {
			 
			int cod_cliente = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe o código: "));               
			con = ConnectionFactory.createConnection();    
			           PreparedStatement ps = con.prepareStatement("insert into pessoa (cod_cliente) values (?)");    
			           			  
			            ps.setInt(1, cod_cliente);    
			                
			            ps.executeUpdate();    
			            ps.close();  
			            con.close();  
			            
		}			            
			            catch(Exception e) {  
			  		      System.out.println ("Não foi possivel conectar com o banco! - Erro Conexão ClienteDAO");
			  		      e.printStackTrace();
		}              
	}
}

:smiley:

Q

Obrigado todos que ajudaram, arrumando um pouco de um, um pouco de outro que consegui. :smiley:

G

ae… agora edita seu tópico e adiciona o Resolvido.

:smiley:

Criado 15 de março de 2012
Ultima resposta 16 de mar. de 2012
Respostas 21
Participantes 6