PreparedStatement dando NullPointerException

9 respostas
H

Estou tentando fazer um Insert com PreparedStatement e tá dando nullpointerexception na linha 7, existe algum erro no código?
Obrigado.

public void inserir(String nome, String endereco, String uf) {

        String sql;
        sql = "INSERT INTO cadastro(nome, endereco, uf)" + " VALUES(?,?,?)";

        try {
            PreparedStatement pstmt = con.prepareStatement(sql); // ERRO AQUI!

            pstmt.setString(1, nome);
            pstmt.setString(2, endereco);
            pstmt.setString(3, uf);

            System.out.println(sql);//confirmação
            pstmt.executeUpdate();// não vai sql dentro dos parenteses
            JOptionPane.showMessageDialog(null, "Cadastro adicionado.");

        }

obs: a tabela tem um id só que como é autonumeração não coloquei.

9 Respostas

robsonmrsp

Certifique-se que o objeto Connection foi instanciado, pelo que ví, o objeto null é o con.

Onde ele é declarado???
onde ele é instanciado???

Ví que não é nesse método!

Nykolas_Lima

exatamente, verifique o objeto de conexão.

As vezes voce está tratando caso haja algum erro ao conectar, e ele está retornando uma conexão null e você não ercebeu ou voce simplesmente não está instanciando uma conexao.

Provavelemente é isso…

falou

H

O con está dentro da classe mas fora do método.
O que eu faço é:

abrir conexão
inserir()
fechar conexão

public class Metodos {

    private Statement stmt;
    private ResultSet rs;
    private Connection con;

    public void inserir(String nome, String endereco, String uf) {

        String sql;
        sql = "INSERT INTO cadastro(nome, endereco, uf)" + " VALUES(?,?,?)";

        try {
            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setString(1, nome);
            pstmt.setString(2, endereco);
            pstmt.setString(3, uf);

            System.out.println(sql);//confirmação
            pstmt.executeUpdate();
            JOptionPane.showMessageDialog(null, "Cadastro adicionado.");

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Erro na operacao requisitada\n" + e.toString(), "Alerta", JOptionPane.INFORMATION_MESSAGE);
        }
    }
}
igor_jua

Experimente abrir a conexão no inicio do método e fecha-la com um finally neste!
:smiley:

Mero_Aprendiz
hmoleman:
O con está dentro da classe mas fora do método. O que eu faço é:

abrir conexão
inserir()
fechar conexão

public class Metodos {

    private Statement stmt;
    private ResultSet rs;
    private Connection con;

    public void inserir(String nome, String endereco, String uf) {

        String sql;
        sql = "INSERT INTO cadastro(nome, endereco, uf)" + " VALUES(?,?,?)";

        try {
            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setString(1, nome);
            pstmt.setString(2, endereco);
            pstmt.setString(3, uf);

            System.out.println(sql);//confirmação
            pstmt.executeUpdate();
            JOptionPane.showMessageDialog(null, "Cadastro adicionado.");

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Erro na operacao requisitada\n" + e.toString(), "Alerta", JOptionPane.INFORMATION_MESSAGE);
        }
    }
}

Olá.
Posta pra gente o trecho no seu código que você faz a conexão com o banco de dados.

[]'s
JL

H

sempre dá conexão bem sucedida.

public class Conexoes {

    private static Connection con;
    private static Statement stmt;

    public static void conectar() {

       try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bancoMysql", "", "");

            stmt = con.createStatement();
            System.out.println("-------> Conexão bem sucedida! <-------");

        } catch (Exception e) ...
H

Pois é, quando faço o debug e passo pelo con do prepareStatement

PreparedStatement pstmt = con.prepareStatement(sql);

ele indica con=null

luisgarcia173

Então… Sinceramente não sei o que está fazendo, pois não vi você instanciando o método de conexão, ou seja, a variável con ainda está nula.

Não sei se seria interessante para você alterar o seu método para retornar uma conexão:

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

public class Conexoes {

	private static Connection con;

	public static Connection getConnection() {

		con = null;

		try {
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/bancoMysql", "", "");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}

	public static void closeConnection(Connection con) {

		if (con != null){
			try {
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

E depois implementar na sua classe de Metodos:

private final String INSERE_CADASTRO = "INSERT INTO cadastro(nome, endereco, uf)" + " VALUES(?,?,?)";
    
    public void inserir(String nome, String endereco, String uf) {   
      	
        try {
        	con = Conexoes.getConnection();
        	
            PreparedStatement pstmt = con.prepareStatement(INSERE_CADASTRO);   
  
            pstmt.setString(1, nome);   
            pstmt.setString(2, endereco);   
            pstmt.setString(3, uf);   
  
            System.out.println(INSERE_CADASTRO);//confirmação   
            pstmt.executeUpdate();   
            JOptionPane.showMessageDialog(null, "Cadastro adicionado.");   
  
        } catch (Exception e) {   
  
            JOptionPane.showMessageDialog(null, "Erro na operacao requisitada\n" + e.toString(), "Alerta", JOptionPane.INFORMATION_MESSAGE);   
        } finally {
        	Conexoes.closeConnection(con);
        }
    }
H

O que fiz e deu certo foi o seguinte:

Tornei minha classe Conexoes abstrata
Extendi a classe Conexoes dentro de Metodos(onde tá meu metodo inserir())
Chamei conectar() dentro da classe Metodos.

Ficou assim:
public class Metodos extends Conexoes{

    public void inserir(String nome, String endereco, String uf) {

        String sql;
        sql = "INSERT INTO cadastro(nome, endereco, uf)" + " VALUES(?,?,?)";

        try {
            conectar();
            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setString(1, nome);
            pstmt.setString(2, endereco);
            pstmt.setString(3, uf);
            System.out.println(sql);

            pstmt.executeUpdate();
            JOptionPane.showMessageDialog(null, "Cadastro adicionado.");

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Erro na operacao requisitada\n" + e.toString(), "Alerta", JOptionPane.INFORMATION_MESSAGE);
        }
        finally{
            Conexoes.desconectar();
        }
    }

Espero que isso não fira nenhum mandamento Java :).

Criado 14 de abril de 2009
Ultima resposta 15 de abr. de 2009
Respostas 9
Participantes 6