【问题标题】:String.length() gives me a wrong valueString.length() 给了我一个错误的值
【发布时间】:2016-01-16 18:20:09
【问题描述】:

每当我输入少于 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);
            }

        }


    }                                        

【问题讨论】:

  • uPass.getPassword() 返回什么?也许它返回某个类的实例,其 toString 方法不返回密码字符串。
  • 您是否尝试过打印对象的值以查看实际包含的内容?
  • 打开你的调试器并显示uPass.getPassword().toString())的值
  • 另外,你为什么要使用uPass.getPassword().toString(),而你本来可以使用Pass1。记住,干。
  • uPass.getPassword() 返回什么?

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


【解决方案1】:

由于您显然使用的是 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()) 从数组中创建一个字符串,您将在堆中创建另一个 对象,该对象包含密码并且也需要从那里删除。所以它会为你增加更多的工作。

【讨论】:

  • 堆栈中关于“拥有密码”的部分在 Java 上下文中是不准确的。即使在其他语言中,变量的范围也不一定决定其内容的存储位置(例如 C/C++ 中的堆栈或堆)。
  • 非常感谢!响应时间非常快!
  • @ray 是的,这取决于类型。我删除了那部分。
  • @Tom:它不依赖于类型。这取决于是否使用new 运算符。您帖子的最后一部分仍然不准确。
  • @ray 对,因为new String(uPass.getPassword()) 不使用new 运算符。
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多