【问题标题】:Comparing JTextField value to multiple arrays [duplicate]将 JTextField 值与多个数组进行比较 [重复]
【发布时间】:2015-12-26 17:45:08
【问题描述】:

我最近开始学习 Java,所以我决定制作一个简单的注册/登录表单。

private JTextField username;
private JPasswordField password;
private JButton check;
private JButton addToDb;
ArrayList<String> dbUser = new ArrayList<String>();
ArrayList<String> dbPassword = new ArrayList<String>();

public trial(){
    super("Title");
    setLayout(new FlowLayout());

    username = new JTextField("",10);
    password = new JPasswordField("",10);
    check = new JButton("Login");
    addToDb = new JButton("Sign Up");
    add(username);
    add(password);
    add(check);
    add(addToDb);

    addToDb.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){
                    if(!username.getText().isEmpty()
                        && !password.getText().isEmpty()){

                        dbUser.add(username.getText());
                        dbPassword.add(password.getText());
                        username.setText("");
                        password.setText("");
                        System.out.println(dbUser + "/" + dbPassword);

                    }else{

                        System.out.println("Please fill the fields and try again!");
                    }
                }
            }               
    );

    check.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent event){

                    for(int i=0; i<dbUser.size();i++){

                        if(username.getText() == dbUser.get(i) && password.getText()== dbPassword.get(i)){
                            JOptionPane.showMessageDialog(null, "Access Granted!");
                        }else{
                            JOptionPane.showMessageDialog(null, "Access Denied!");
                        }                       
                    break;                          
                    }
                }
            }
    );                      
  }
}

如您所见,我创建了两个文本字段(用户名和密码)、两个按钮,一个将值存储在两个不同的数组列表中(我尝试使用 HashMap,但也没有用)。一种将数组中的值与文本字段中的值进行比较的方法。问题是当我使用登录按钮时,它总是说访问被拒绝。任何想法如何解决这个问题?

【问题讨论】:

  • 不要使用==!= 比较字符串。请改用equals(...)equalsIgnoreCase(...) 方法。了解== 检查两个 对象引用 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否以相同的顺序具有相同的字符,这就是这里的重点。所以不要if (fu == "bar") {if ("bar".equals(fu)) {if ("bar".equalsIgnoreCase(fu)) {
  • 此外,当您尝试在 JPassword 字段上调用 ​​getText() 时,您的编译器应该会抱怨 - 聆听该抱怨,并且为了代码安全和安全编码不要调用该方法。而是使用 getPassword() 返回的 char 数组。
  • @morpheus05 如果我们不将这些问题标记为重复,那么 SO 将充满这样的问题。字符串比较是用户非常错误/困惑的。将它们标记为重复有助于保持 SO 的质量。
  • @morpheus05:我认为您严重误解了将问题标记为重复的含义。这绝不是对原始发帖人或他的问题的惩罚——而是通过否决票来完成的(你可以很容易地看到我没有否决这个问题)。这意味着是的,这个问题之前已经被问过,并且要了解有关该问题的更多信息并解决它,请阅读链接的问题及其答案,这些答案比此处提供的答案要好得多。
  • @morpheus05:真正的问题是,这个网站真的需要另一个 String == vs. equals 问题或另一个 NullPointerException 吗?新答案真的会提供比以前提供的更多或更好的信息吗?我认为答案显然是,不。

标签: java arrays jtextfield


【解决方案1】:

在 java 中,Strings 与 equals 进行比较,而不是 ==。原因是,字符串是对象而不是原语。有关==equals() 的更多信息,请参阅What is the difference between == vs equals() in Java?

所以if 表达式是错误的:

username.getText().equals(dbUser.get(i)) && password.getText().equals( dbPassword.get(i))

【讨论】:

    【解决方案2】:

    如果你想比较字符串使用equals方法,==会比较地址

    所以改变

    if(username.getText() == dbUser.get(i) && password.getText()== dbPassword.get(i))
    

    if(username.getText().equals(dbUser.get(i)) && password.getText().equals(dbPassword.get(i)))
    

    【讨论】:

    • Java 没有地址,它们被称为reference== 比较对象持有的引用。
    • 我同意@YoungHobbit。不管怎样,这个问题很常见,并且被问过很多次,以至于它甚至不应该被回答,而是作为重复而关闭,我做了一些事情,但只有在 2 个答案滑过之后。
    • 对不起,我认为问题与我的数组列表有关,而不是与我的操作员有关。原因是我尝试了几种不同的方法来构建我的“if 语句”,但没有成功。看起来我没有尝试最明显的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多