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!

[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 :).