我试图使用jdbc从textfield向mySql插入值,但我的问题是在关闭我的预准备语句时出现空指针错误。这是我的代码
private Connection con;
private Statement stm;
private ResultSet rs;
private PreparedStatement ps ;
public void dbConnect(){
try{
Class.forName("com.mysql.jdbc.Driver");
this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbTestDrive"
+ "", "root", "password");
}
catch(ClassNotFoundException ex){}
catch(SQLException ex){}
}
public boolean insert(Member member)throws SQLException{
this.dbConnect();
boolean success = false;
String query = "INSERT INTO try VALUES(?, ?)";
try {
this.ps = this.con.prepareStatement(query);
this.ps.setString(1, member.getMemberId());
this.ps.setString(2, member.getFirstName());
int rows = this.ps.executeUpdate();
if(rows>0){
success = true;
}
} catch (SQLException ex) {
ex.printStackTrace();
throw ex;
} finally{
this.ps.close(); // this is my line: 56 (im getting null pointer here)
this.con.close();
}
return success;
}
这是stacktrace:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at rtu.tomis.dao.MemberDao.insert(MemberDao.java:56)
at rtu.tomis.gui.AddMemberView.btnSaveActionPerformed(AddMemberView.java:993)
at rtu.tomis.gui.AddMemberView.access$800(AddMemberView.java:21)
at rtu.tomis.gui.AddMemberView$9.actionPerformed(AddMemberView.java:476)
谢谢你的帮助
答案 0 :(得分:3)
您在try
块内部,在执行此行之前或之后的某个位置收到异常:
this.ps = this.con.prepareStatement(query);
在catch
块重新抛出异常后,执行finally
块。不幸的是,因为ps
是null
,所以会得到另一个异常,然后抛出异常,隐藏原始异常。
您需要更具防御性地编码,仅在ps
con
关闭null
和close()
时关闭,并捕获try
调用可能会引发的任何异常。这将允许您传播try
主体抛出的任何异常。
您也不应该默默地忽略dbConnect()
{{1}}块中引发的异常。我怀疑你的问题存在例外。
答案 1 :(得分:2)
您应该像这样编写代码:
finally{
if(ps != null)
try{
this.ps.close();
}catch(Exception e){
System.out.println("PreparedStatement close problem");
}
if(con != null)
try{
this.con.close();
}catch(Exception e){
System.out.println("Database Connection close problem");
}
}
如果由于某些错误而未初始化con
或ps
中的任何一个,这将避免空指针异常。
此外,您可以从所有代码中删除this
关键字,因为您的方法中没有任何与您的类变量同名的局部变量,因此不存在任何歧义
答案 2 :(得分:0)
您需要在finally子句
中检查nullfinally{
if(ps != null)
this.ps.close();
//
}
但潜在的问题可能是当您打开连接后,它将无法初始化您准备好的声明
this.ps = this.con.prepareStatement(query);
换句话说,在调用prepareStatement
之前,请确保con
不为空。您应该更改方法dbConnect
并打印例外,这将有助于您解决问题的原因。
try{
Class.forName("com.mysql.jdbc.Driver");
this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbTestDrive"
+ "", "root", "password");
}
catch(ClassNotFoundException ex){
ex.printStackTrace();
}
catch(SQLException ex){
ex.printStackTrace();
}
答案 3 :(得分:0)
我认为你的dbConnect()方法中抛出了一个异常,这就是为什么jvm在读取你准备好的语句的实例化之前直接读取finally的原因。
答案 4 :(得分:0)
你没有在insert方法中获取Prepared Statement对象,并且在null上调用任何内容都会给你Null Pointer Exception。