Java 如何让else块在for循环中只执行一次

Java 如何让else块在for循环中只执行一次,java,if-statement,Java,If Statement,我有一个for循环,用于比较用户登录详细信息以启动应用程序的下一个屏幕 如果用户输入的字段与从数据库返回的ArrayList中的数据成功匹配,程序将启动下一个屏幕——如果不匹配,则使用JOptionPane向用户输出错误消息 我的问题是for循环的每次迭代都会输出错误消息,但我希望消息只显示一次 //if name or password are NOT left blank proceed with the check otherwise output error message in t

我有一个
for
循环,用于比较用户登录详细信息以启动应用程序的下一个屏幕

如果用户输入的字段与从数据库返回的
ArrayList
中的数据成功匹配,程序将启动下一个屏幕——如果不匹配,则使用
JOptionPane
向用户输出错误消息

我的问题是
for
循环的每次迭代都会输出错误消息,但我希望消息只显示一次

  //if name or password are NOT left blank proceed with the check otherwise output error message in the text area
    if (!name.equals("") && !password.equals("")) {
        for (int i = 0; i < passwords.size(); i++) {
            if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) {
                myHomeGUI.setVisible(true);
                break;
            } else {
                JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again");
            }
        }//end for loop 
    } else {
        JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank");
    }//end
//如果名称或密码未保留为空,则继续检查文本区域中的“否则输出错误消息”
如果(!name.equals(“”)&!password.equals(“”){
对于(int i=0;i
之所以发生这种情况,是因为您将
else条件
放在了
循环中
,该循环在每次
迭代中执行

试试这个:

boolean isValid=false; 
for (int i = 0; i < passwords.size(); i++) {
            if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) {
                myHomeGUI.setVisible(true);
                isValid=true;
                break;
            }
 }//end for loop 
 if(!isValid) {
JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again");
}
然后签入您的登录控制器

if(isAuthenticationPassed){
  // Do whatever you want to do 
}
else{
//Return to Login Page with error / or show Dialog Box
}

正如上面的评论所说:你也可以用一个地图来代替两个列表

    Map<String,String> map = new HashMap<String,String>();
    map.put("john", "1234");
    map.put("test", "asdf");

    String name = "test";
    String password = "asdf";


     //if name or password are NOT left blank proceed with the check otherwise output error message in the text area
    if (!name.equals("") && !password.equals("")) {

            if(map.get(name)!=null && map.get(name).equals(password))
                myHomeGUI.setVisible(true);
                break;
            } else {
                JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again");
           }         
    } else {
        JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank");

    }//end
Map Map=newhashmap();
地图放置(“约翰”,“1234”);
地图放置(“测试”、“asdf”);
String name=“test”;
字符串密码=“asdf”;
//如果名称或密码未保留为空,则继续检查文本区域中的“否则输出错误消息”
如果(!name.equals(“”)&!password.equals(“”){
if(map.get(name)!=null&&map.get(name).equals(密码))
myHomeGUI.setVisible(true);
打破
}否则{
showMessageDialog(null,“对不起,没有使用这些凭据识别的用户\n请重试”);
}         
}否则{
showMessageDialog(null,“对不起,没有字段可以留空”);
}//结束

如果您将代码重构为更具逻辑性的部分,那么编码和理解就会容易得多,例如:

if (name.equals("") || password.equals("")) {
    JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank");
} else if(doesUserExist(name, password)) {
    myHomeGUI.setVisible(true);
} else {
    JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again");
}

// ... new method

private boolean doesUserExist(String name, String password) {
    for (int i = 0; i < passwords.size(); i++) {
        if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) {
            return true;
        }
    }
    return false;
}
if(name.equals(“”)| password.equals(“”){
showMessageDialog(null,“对不起,没有字段可以留空”);
}else if(doesUserExist(名称、密码)){
myHomeGUI.setVisible(true);
}否则{
showMessageDialog(null,“对不起,没有使用这些凭据识别的用户\n请重试”);
}
// ... 新方法
私有布尔doesUserExist(字符串名称、字符串密码){
对于(int i=0;i
因此在消息后添加中断语句;尝试过,如果我在else中的消息后有一个break语句,它将不起作用。例如,如果我的用户名arraylist的第三个位置是david,并且用户输入了不在数组列表中的john,那么它将跳出循环,永远不会达到david的程度,因此永远不会计算为True。我会考虑更改用户名/密码。你为什么有两张清单?例如,有一个包含用户名/密码的(散列)映射不是更好吗?那么你就不需要在一个循环中通过了。只需将密码与映射进行比较即可。获取(用户名)谢谢,我以前没有使用过哈希映射,但我会研究它,这是我正在进行的一个大学项目。这几乎就是我将使用的结构。您甚至可以将整个for循环移动到一个方法(boolean authenticateUser(name,password))中,并执行以下操作:if(!authenticateUser(name,password))@Joeblade,我是模块化方法的忠实支持者,但我很匆忙,所以没有提供太多建议。在我的答案中添加此建议:)永远不应该公开
密码(或其他机密/敏感信息)
在源代码中是这样的。这是一种糟糕的做法您当然完全正确!RoRo88以前没有使用过地图,所以我只想让他展示如何插入数据。
if (name.equals("") || password.equals("")) {
    JOptionPane.showMessageDialog(null,"Sorry, no fields can be left blank");
} else if(doesUserExist(name, password)) {
    myHomeGUI.setVisible(true);
} else {
    JOptionPane.showMessageDialog(null,"Sorry, no user recognized with those credentials\nPlease try again");
}

// ... new method

private boolean doesUserExist(String name, String password) {
    for (int i = 0; i < passwords.size(); i++) {
        if (name.equals(userNames.get(i)) && (password.equals(passwords.get(i)))) {
            return true;
        }
    }
    return false;
}