String.length()给了我一个错误的值

时间:2015-10-18 10:28:07

标签: java string if-statement try-catch string-length

每当我输入10个字符以下的密码时,它就会给我Password cannot exceed 10 characters

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String name = Name.getText();
        String Username = uName.getText().toString();
        String Pass1 = uPass.getPassword().toString();
        String Confirm = uConfirm.getPassword().toString();
        String Status = "OFFLINE";
        int PassLen = Pass1.length();

        if (Username.equals("") || Pass1.equals("") || Confirm.equals("") || name.equals("")) 
        {
            JOptionPane.showMessageDialog(null, "You cannot leave any fields blank when creating an Account. Please Try Again");
        } 
        else if ((uPass.getPassword().toString()).length()>10)
        {
            uPass.setText("");
            uConfirm.setText("");
            JOptionPane.showMessageDialog(null, "Password cannot exceed a maximum of 10 characters.");  
        }
        else if (!Pass1.equals(Confirm))
        {
            uConfirm.setText("");
            lblError1.setText("Passwords Do Not Match.");
            lblError2.setText("Please re-enter your Password.");
        }
        else
        {
            try {
                DB_Connect connect = new DB_Connect();
                ResultSet rs = connect.queryTbl("SELECT * FROM ACOUNTS");
                boolean AlreadyUser = false;
                String User;
                while (rs.next())
                {
                    User = rs.getString("Username");
                    if(Username.equals(User))
                    {
                        AlreadyUser = true;
                    }
                }
                if (AlreadyUser==false)
                {
                    connect.updateTbl("INSERT INTO NBUSER.ACCOUNTS (USERNAME,PASSWORD,STATUS,NAME)VALUES ('"+Username+"','"+Pass1+"','"+Status+"','"+name+"')");
                    JOptionPane.showMessageDialog(null, "Account Created Successfully !");
                    this.dispose();
                    new Topics().setVisible(true);
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "The Username you have selected already exists. Please select a different Username");
                    uPass.setText("");
                    uConfirm.setText("");
                }
            } catch (SQLException ex) {
                Logger.getLogger(CreateAccount.class.getName()).log(Level.SEVERE, null, ex);
            }

        }


    }                                        

1 个答案:

答案 0 :(得分:5)

由于您显然使用的是Swing,因此您很可能使用JPasswordField作为密码。让我们看看getPassword真正做了什么:

  

public char[] getPassword()

     

返回此TextComponent中包含的文本。如果底层文档为null,则会给出NullPointerException。为了提高安全性,建议在使用后通过将每个字符设置为零来清除返回的字符数组。

     

返回:文字

正如您所看到的,它会在char[]中返回您的密码,因为此类不会覆盖toString,您调用uPass.getPassword().toString()会导致类似以下内容:

  

[C @ 1d44bcfa

这是调用Object#toString的结果。

此字符串的长度为11,因此大于10,并且您的else if块(else if ((uPass.getPassword().toString()).length()>10))将被输入。

要解决此问题,请调用String构造函数String(char[]),如:

String Pass1 = new String(uPass.getPassword());

请将此用作当前问题的“快速修复”,并尝试找到使用原始返回的char[]的方法。正如引用的JavaDoc所提到的那样,在使用它之后会建议“清理”char数组,因此密码将不再存储在那里。通过使用new String(uPass.getPassword())从数组创建String,您将在堆中创建另一个对象,其中包含密码,并且还需要从中删除。所以它会为你增加更多的工作。