java.lang.nullPointerException注册按钮

时间:2013-06-06 23:19:05

标签: nullpointerexception

我添加以下内容将我的程序的注册页面连接到我的数据库,但每当我按下注册按钮来测试帐户时,都会收到错误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) {

            }
        }
    }
    });

1 个答案:

答案 0 :(得分:0)

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

  

public JTextField()

     

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

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

你可以通过做一些事情来改进这门课程:

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

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