簡體   English   中英

String.length()給我一個錯誤的值

[英]String.length() gives me a wrong value

每當我輸入的密碼少於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);
            }

        }


    }                                        

由於您顯然正在使用Swing,因此很可能使用JPasswordField作為密碼。 讓我們來看一下getPassword真正作用:

public char[] getPassword()

返回此TextComponent中包含的文本。 如果基礎文檔為null,則將提供NullPointerException。 為了提高安全性,建議在使用后通過將每個字符設置為零來清除返回的字符數組。

返回:文本

如您所見,它以char[]返回您的密碼,並且由於此類不會覆蓋toString您對uPass.getPassword().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所提到的,建議在使用完字符數組后建議“清理”該字符數組,因此不再將密碼存儲在此處。 通過使用new String(uPass.getPassword())從數組創建字符串,您將在堆中創建另一個對象,該對象包含密碼,並且也需要從該對象中刪除該對象。 因此,它將為您增加更多的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM