0

我添加了以下内容以将我的程序的注册页面连接到我的数据库,但每当我按下注册按钮测试创建帐户时都会收到错误 java.lang.nullPointerException。我认为问题是 getText 必须是 getPassword 但是当我这样做时我会收到一个方法。有人有想法么?

register = new JButton("Register");
    register.setBackground(Color.black);
    register.setForeground(Color.white);
    register.setBounds(250, 12, 120, 30);
    register.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent reg) {
            if (firstName.getText().equals("") || lastName.getText().equals("") || age.getText().equals("") || user.getText().equals("") || pass.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "Invalid Input Data.\nPlease Try Agian.", "Error", JOptionPane.ERROR_MESSAGE);
                return;
            }
            try{
                String sql = "INSERT INTO Users (ID, First Name, Last Name, Age, Username, Password) VALUES (?, ?, ?, ?, ?, ?)";
                    ps = conn.prepareStatement(sql);
                    ps.setInt(1, 0);
                    ps.setString(2, firstname.getText());
                    ps.setString(3, lastname.getText());
                    ps.setString(4, age.getText());
                    ps.setString(5, user.getText());
                    ps.setString(6, pass.getText());
                    ps.execute();
                    JOptionPane.showMessageDialog(null, "Registration Successful!/nYou can now log into the database.");
            }catch(Exception e){
                JOptionPane.showMessageDialog(null, e);
            }
        finally {
            try{
                rs.close();
                ps.close();
            }catch(Exception e) {

            }
        }
    }
    });
4

1 回答 1

0

从 JTextField 的默认构造函数的 Javadoc 中:

公共 JTextField()

构造一个新的 TextField。创建一个默认模型,初始字符串为空,列数设置为 0。

因此,如果用户不填写firstName, firstName.getText() == null,则会抛出 NPE。

你可以通过做一些事情来改进这个类:

  1. 子类化AbstractAction并与您的按钮一起使用;AbstractAction也可以在菜单中使用。
  2. 在文本和密码字段上放置一个DocumentListener以启用或禁用抽象操作,这也启用和禁用按钮。
  3. 在控制器类中完成所有实际工作;将数据库代码移出 Swing 类。你能想象写入数据库或检查非 UI 类的用户信息吗?那就不要在这里做。
  4. 切勿将密码(或信用卡号)存储在数据库中。始终存储盐渍哈希。
  5. 将 Java 7 try-with-resources 用于PreparedStatement. 小心; 如果closefinally 块中的第一条语句抛出,则第二条语句永远不会执行;您需要包装rs.close()在 try-catch 块中。但是 try-with-resources 使这无关紧要。顺便说一下,从 Javadoc 的 close 方法,

当 Statement 对象关闭时,其当前的 ResultSet 对象(如果存在)也将关闭。

于 2013-06-07T00:02:23.440 回答