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


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();
			}*/
						   
	}  
				
}

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.

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.

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.

[code]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 ;

}  

} [/code]

Cara essa linha:

[code]
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();  
                  
      [/code]

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:

[code]

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();
                  
    
       }   [/code]
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?

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.

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

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;

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.

[quote=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; [/quote]

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

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

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

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;

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.

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?

[quote=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?[/quote]

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;

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

Seu problema agora é aqui:

[code]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);     [/code]

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:

outra coisa, se tua tabela tem mais colunas, acho que tu vai ter que passar elas ali, caso elas não sejam nuláveis.

[quote=Guilherme Tsubauchi]aí, vamo ao próximo erro.
Sua conexão foi feita com sucesso.

Seu problema agora é aqui:

[code]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);     [/code]

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:

outra coisa, se tua tabela tem mais colunas, acho que tu vai ter que passar elas ali, caso elas não sejam nuláveis.[/quote]

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();

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: