【问题标题】:Java username and password always returns true [closed]Java 用户名和密码始终返回 true [关闭]
【发布时间】:2015-03-21 14:48:51
【问题描述】:

我正在做一个项目,并一直在尝试隐含用户名/密码。下面你会看到代码。每当我单击登录按钮时,用户名都会更改为 bobsyouruncle,这表明它在方法中找到了“真”值。问题是它总是如此,无论输入如何。这更加令人困惑,因为如果我将下面的“return true”更改为“return false”,那么我仍然会得到 bobsyouruncle。有什么建议吗?

    loginButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            Boolean authenticated = AuthenticateCredentials(usernameField.getText(),passwordField.getPassword());

            if(authenticated = true){
                usernameField.setText("Bobsyouruncle");
            } else {
                System.exit(0);
            }

        }
    });

下面是访问的方法。

private Boolean AuthenticateCredentials(String user, char[] pass) {
    //This is only a placeholder.
    String theCorrectAnswer = "42";
    String theCorrectUser = "FPrefect";
    char[] passcode = theCorrectAnswer.toCharArray();
    optionPanel.showInternalMessageDialog(securityPanel,"Eggs are not supposed to be green.");
    if (user.equals(theCorrectUser) && Arrays.equals(passcode,pass)) {
        return true;    
    } else {
        return false;
    }

}

如果有人想告诉我,我已经搞砸了创建一个安全的用户名和密码来省去我以后的麻烦,那也是花花公子。

【问题讨论】:

  • 仔细查看if(authenticated = true){= 在 Java 中做了什么?
  • 如果忘记双等号== 对您来说是一个常见问题,您可以尝试将您的条件写成(immutable-value == mutable-value)(true == authenticated) 如果您不小心输入了(true = authenticated),您会得到一个编译错误,而不必弄清楚它为什么不工作
  • @chancea 是的,但在布尔值的情况下,简单的if (boolValue)if(boolValue==true) 更简单、更安全。同样对于if (boolValue==false)if(booValue!=true),我们可以简单地将其写为if (!boolValue)
  • 你应该用更简单的替换你的if(condition) return true; else return false;return (condition);

标签: java arrays passwords char


【解决方案1】:

您使用= 进行赋值,但此处需要的比较运算符是==。但是,authenticated 已经是 boolean,所以只需使用:

if(authenticated){

【讨论】:

    【解决方案2】:

    这里的问题是您试图将两个表达式与= 符号进行比较,这意味着 assignment 在java中。 比较符号是==

    但是,如果您以这种方式更改代码:

    if(authenticated == true)
    

    您仍在比较 Object (Boolean) 和 primitive type (boolean)。

    正确的做法是使用boolean。将你的函数形式Boolean的返回值更改为boolean

    private boolean AuthenticateCredentials(String user, char[] pass) {
        return (user.equals("FPrefect") && Arrays.equals("42".toCharArray(), pass);
    }
    

    然后,在你的按钮监听器中做同样的事情:

    boolean authenticated = AuthenticateCredentials(usernameField.getText(),passwordField.getPassword());
    if(authenticated)
        usernameField.setText("Bobsyouruncle");
    else
        System.exit(0);
    

    【讨论】:

    • 为什么 OP 应该做所有这些改变?
    • 如果你解释一下理由,那将是一个更好的答案。
    • @DavidConrad - 完成。
    • 但是为什么“正确的方法是始终使用布尔值”?尝试将Booleanboolean 进行比较有什么问题?拆箱会为我们处理它并将Boolean 值更改为原始boolean 值。
    • 好的,我同意在这种情况下Boolean 是不需要的,boolean 就足够了。但这不是 OP 主要问题的解决方案,而是微小的改进,这意味着您的答案并不是真正的答案,而是更像是代码示例的注释。通常我会否决它并继续前进,但由于您是 SO 的新手,而且大多数新成员倾向于更个人地对待否决票,我更愿意问您问题,希望能改善您的答案并为 OP 提供更多有关它的信息。该计划从现在开始有效,它包含有关 === 的信息,此外,OP 可以从我们的 cmets 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多