PreparedStatement dando NullPointerException

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

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

    }[/code]

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

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!

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

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

abrir conexão
inserir()
fechar conexão

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

}[/code]

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

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

abrir conexão
inserir()
fechar conexão

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

}[/code][/quote]

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

[]'s
JL

sempre dá conexão bem sucedida.

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

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

PreparedStatement pstmt = con.prepareStatement(sql);

ele indica con=null

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

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:

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

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