0

您好,我在这里要做的是接收用户输入的密码,然后将其与 if 语句中的正确密码进行比较。

public void actionPerformed(ActionEvent event)
{
    String UsersStoredPassword = "hello";
    String UsersEnteredPassword = new String(PasswordField.getPassword());
    String Message = "The Password You Have Entered Is Correct";
    String Message1 = "You Have Entered The Wrong Password";

    if (event.getSource() == PasswordField)
    {
        if (UsersEnteredPassword == UsersStoredPassword)
        {
            JOptionPane.showMessageDialog(null, Message);
        }
        else
        {
            JOptionPane.showMessageDialog(null, Message1);
        }

    }
}

然而事件认为用户输入了正确的密码:“你好”它仍然显示消息1:“你输入了错误的密码。我试过这样做:

public class TheHandler implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {

        String UsersStoredPassword = "hello";
        String UsersEnteredPassword = new String(PasswordField.getPassword());
        String Message = "The Password You Have Entered Is Correct";
        String Message1 = "You Have Entered The Wrong Password";

        if (event.getSource() == PasswordField)
        {
            JOptionPane.showMessageDialog(null, UsersEnteredPassword);
        }
    }
}

它显示在里面输入的 UsersEnteredPassword。

4

3 回答 3

4

您正在Strings使用==不比较String内容的运算符比较 2 但这不是真正的问题:

您在这里创建了一个安全漏洞。

解释: JPassword.getText被故意弃用以避免使用Strings,而是使用char[]返回的getPassword.

调用时getText,您会得到一个可能不会更改(反射除外)的字符串(不可变对象),因此密码会保留在内存中,直到垃圾收集。

然而,一个字符数组可能会被修改,所以密码实际上不会留在内存中。

Array.equals改为使用

if (Arrays.equals(usersEnteredPassword.toCharArray()), 
      passwordField.getPassword()) {
      // password match!
}

另外:遵循 Java 命名约定,使用小写字母作为变量名称的首字母,如上所示。阅读命名约定

于 2013-10-22T10:24:16.147 回答
1
if(UsersEnteredPassword == UsersStoredPassword){

if(UsersEnteredPassword.equals(UsersStoredPassword)){

关于对象操作

==意思是,指向同一个地址?或者,它是完全相同的对象?

equals比较内容。

于 2013-10-22T10:19:05.400 回答
1

不应将字符串与'=='. 您应该始终使用.equals(Object)检查任何对象的相等性的方法来检查相等性。'==' 仅用于比较原始数据类型,而不用于比较对象。'==' 比较左右操作数的物理内存地址是否相等。.equals(Object)检查左右操作数是否有意义地等价。希望这可以帮助

于 2013-10-22T10:24:51.687 回答