【问题标题】:Cannot insert data to MySQL with Servlet无法使用 Servlet 将数据插入 MySQL
【发布时间】:2013-12-06 11:57:04
【问题描述】:

我正在使用 Netbeans JAVA(JSP 和 Servlet)和 MySQL 开发一个 Web 应用程序,并且我正在尝试创建一个“注册”功能。

因此,我从 JSP 调用 SignUp Servlet,它调用 PostUserData。 Userbean 只是保留数据,以便我可以轻松地在 JSP 中再次显示它们。

我收到错误“java.lang.NullPointerException - model.DataManager.PostUserData(DataManager.java:191)”,它指向结果集的关闭位置。

public UserBean PostUserData(String username, String password, String first_name, String last_name, String email)
                {
                        UserBean userBean = new UserBean();
                        Connection conn = getConnection();
                        if (conn != null) 
                    {
                        ResultSet rs1 = null;
                            ResultSet rs2 = null;
                            PreparedStatement pst1 = null;
                            PreparedStatement pst2 = null;
                            try
                        {
                                        String strQuery1 = "select * from user where uid=?";
                                        pst1 = conn.prepareStatement(strQuery1);
                                        pst1.setString(1, username);
                                        rs1 = pst1.executeQuery();
                                        boolean usernameExists = rs1.next();            
                                        if (usernameExists  == false) {    
                                            String student = "student";
                                            String strQuery2 = "INSERT INTO user VALUES (?, ?, ?, ?, ?, ?)";
                                            pst2 = conn.prepareStatement(strQuery2);
                                            pst2.setString(1, username);
                                            pst2.setString(2, password);
                                            pst2.setString(3, first_name);          
                                            pst2.setString(4, last_name);
                                            pst2.setString(5, email);
                                            pst2.setString(6, student);
                                            rs2 = pst2.executeQuery();                                                       
                                        } else         
                                            {    
                                               userBean.setUidExists(true);
                                            }   
                        }//end of try
                            catch(SQLException ex)
                            {
                                ex.printStackTrace();
                            }
                            finally 
                            {
                                try 
                                { 
                                    rs1.close();
                                    rs2.close();
                                    pst1.close();
                                    pst2.close();
                                }
                                catch (SQLException e) {e.printStackTrace();}
                                putConnection(conn);                
                            }//end of finally 
                        }//end of if
                    return userBean;

                    }

我已经用同样的方法做了一个登录功能,它与我的数据库完美配合,所以 MySQL 没有问题。我还在 MySQL 工作台中测试了插入脚本,它工作正常。

最后,当我删除代码时

>                                     rs1.close();
>                                     rs2.close();
>                                     pst1.close();
>                                     pst2.close();

在try之外,它会检查用户名是否存在,所以问题肯定出在INSERT脚本上。感谢您的宝贵时间。

【问题讨论】:

  • 哪条语句给了你NPE?如果 usernameExists=true 则 rs2 可以为空
  • 投票关闭 - 根据 OP,问题已解决。

标签: java mysql jsp servlets netbeans


【解决方案1】:

rs2 默认为空。
仅当条件 (usernameExists == false)true 时才会启动。
但我认为存在一条记录,因此usernameExists 返回一个true,以上条件变为false。因此rs2 仍然是null

null 指向引用上,您不能调用任何特定于对象的方法。
否则会产生NullPointerException。你的情况也一样。

  1. 除非需要,否则不需要在 finally 块中捕获异常。
  2. 在 finally 块中也使用if( rs2 != null ) rs2.close();

您可以对每个此类对象采取类似的谨慎措施。

【讨论】:

  • 有用的提示,但插入脚本不再起作用。如果我在 try-catch 中单独移动插入代码,它会捕获异常。奇怪的是,当我在 Workbench 中使用相同的脚本时,它运行良好。
  • 问题不在您的insert ... 声明中。
【解决方案2】:

更新:问题已解决

我将rs2 = pst2.executeQuery(); 替换为

rs2 = pst2.executeUpdate();

它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多