2015-10-18 49 views
1

每當我輸入密碼在10個字符以下,它給我Password cannot exceed 10 charactersString.length()給我一個錯誤的值

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); 
      } 

     } 


    }           
+0

uPass.getPassword()返回什麼?也許它返回一個類的實例,其toString方法不返回密碼String。 – Eran

+1

[mcve],請! –

+2

您是否嘗試過打印對象的值以查看*實際*包含的內容? – ray

回答

5

由於您明顯在使用Swing,因此很可能您的密碼使用了JPasswordField。因此,讓我們來看看,什麼getPassword確實:

public char[] getPassword()

返回此TextComponent中包含的文本。如果底層文檔爲空,則會給出NullPointerException。爲了更強的安全性,建議通過將每個字符設置爲零來清除返回的字符數組。

返回:文本

正如你所看到的,它在一個char[]返回您的密碼,因爲這個類沒有重載toString你在類似的uPass.getPassword().toString()業績電話:

[C @ 1d44bcfa

這是調用的結果。

該字符串的長度爲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()),您正在創建另一個堆中的對象,其中包含密碼並且還需要從中刪除。所以它會爲你增加更多的工作。

+0

有關堆棧中「擁有密碼」的部分在Java環境中不準確。即使在其他語言中,變量的作用域並不一定指定其內容的存儲位置(例如C/C++中的堆棧或堆)。 – ray

+0

非常感謝!非常快速的響應時間! – Edge

+0

@ray是的,這取決於類型。我刪除了那部分。 – Tom