在PreparedStatement.close()中获取空指针

时间:2012-12-20 04:31:37

标签: java

我试图使用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)

谢谢你的帮助

5 个答案:

答案 0 :(得分:3)

您在try块内部,在执行此行之前或之后的某个位置收到异常:

this.ps = this.con.prepareStatement(query);

catch块重新抛出异常后,执行finally块。不幸的是,因为psnull,所以会得到另一个异常,然后抛出异常,隐藏原始异常。

您需要更具防御性地编码,仅在ps con关闭nullclose()时关闭,并捕获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");
        }
}

如果由于某些错误而未初始化conps中的任何一个,这将避免空指针异常。

此外,您可以从所有代码中删除this关键字,因为您的方法中没有任何与您的类变量同名的局部变量,因此不存在任何歧义

答案 2 :(得分:0)

您需要在finally子句

中检查null
finally{
  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。