简体   繁体   中英

String.length() gives me a wrong value

Whenever I enter a password under 10 characters it gives me 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);
            }

        }


    }                                        

Since you're obviously using Swing, it is also very likely that you use a JPasswordField for your passwords. So let's see, what getPassword really does:

public char[] getPassword()

Returns the text contained in this TextComponent. If the underlying document is null, will give a NullPointerException. For stronger security, it is recommended that the returned character array be cleared after use by setting each character to zero.

Returns: the text

As you can see, it returns your password in a char[] and since this class doesn't override toString your call of uPass.getPassword().toString() results in something like:

[C@1d44bcfa

which is the result of calling Object#toString .

The length of this String is 11 and therefore larger then 10 and your else if block ( else if ((uPass.getPassword().toString()).length()>10) ) will be entered.

To fix that, call the String constructor String(char[]) like:

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

Please use this just as a "quick fix" for your current problem and try to find a way to use the originally returned char[] . As mentioned by the quoted JavaDoc it is recommened the "clean" the char array after using it, so the password won't be stored there anymore. By creating a String from the array, using new String(uPass.getPassword()) , you're creating another object in the heap which contains the password and which also needs to be removed from there. So it would add more work for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM