检查while while循环

时间:2014-11-25 17:45:19

标签: java boolean do-while

我创建了ArrayList个用户。我已经提出了添加新用户的方法。用户必须拥有电子邮件,并且程序必须检查ArrayList以查看用户是否已存在于ArrayList中。如果我分别运行检查正确的电子邮件和正确的名称,它可以工作,但是当我使用此while(userExists || matchFound)组合它时,它不起作用。我已经尝试了一切,所以希望你能帮助我。提前谢谢。

public void addUser()
{
    System.out.println("-----------------------------"); //separation of previous screen
    System.out.println("Create a new user.");

    boolean userExists = false;
    boolean matchFound = false;

    String userToAdd;

    do {
        System.out.println("Username: ");
        userToAdd = input.next();
        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(userToAdd);
        matchFound = m.matches();

        if (matchFound) {
            System.out.println("just a check if it is a email");
        }
        if(!matchFound) {
            System.out.println("no email. Try again.");
            matchFound = true;
        }
        for(User currentUser : db.getUsers()) {
            if (currentUser.getName().equals(userToAdd)) {
                System.out.println("User already exist. Try again.");
                userExists = true;
            }
        }

    } while(userExists || matchFound);
}

5 个答案:

答案 0 :(得分:1)

只要用户不是有效的电子邮件或它已经存在,您就想留在循环中。因此,您需要:

while(userExists || !matchFound);

如果匹配错误,你可能不应该将matchFound设置为true:

if(!matchFound){
    System.out.println("no email. Try again.");
    matchFound = true; // remove this line
}

只应由matchFound = m.matches();

设置

答案 1 :(得分:0)

我认为您需要保留,除非用户名不存在并且具有有效的电子邮件ID。您应该执行以下操作:

while(!userExists || !matchFound);

有了这个,你将循环,直到除非你同时拥有两个有效数据。

答案 2 :(得分:0)

我认为如果你的命名正确,你的代码会更好。 " matchFound"并没有真正说明,我想这就是混乱的来源。这就是为什么我建议你使用" isEmail"代替。这使代码更具可读性。另一个问题是您在循环内部使用仅在循环外部初始化一次的变量。这适用于循环的第一次迭代,但第二次导致不确定的行为。例如,如果您要输入系统中已有的电子邮件,userExists将设置为true,并且对于循环的连续迭代保持为真。

我还删除了电子邮件有效的情况下的输出。如果您只是在出现错误的情况下出现错误,那么用户体验会更好。在输入有效用户名后,您肯定会向用户提供更多功能。这将是足够的反馈,以便用户了解操作是否成功。

这应该有效:

public void addUser()
{
    System.out.println("-----------------------------"); //separation of previous screen
    System.out.println("Create a new user.");

    boolean userExists = false;
    boolean isEmail = false;

    do
    {
        userExists = false;
        isEmail = false;

        System.out.print("Username: ");
        String userToAdd = input.next();

        Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
        Matcher m = p.matcher(userToAdd);
        isEmail = m.matches();

        if (!isEmail) 
        {
            System.out.println("Not an email. Try again.");
        }
        for(User currentUser : db.getUsers()) 
        {
            if (currentUser.getName().equals(userToAdd)) 
            {
                System.out.println("User already exist. Try again.");
                userExists = true;
                break;
            }
        }

    }while(userExists || !isEmail);
}

答案 3 :(得分:0)

  1. 如果错误,则不应将matchfound设置为false。在下一个循环中,默认情况下是正确的。并且你没有在第一个区块中将其更改为false。

  2. 然后您应该使用!matchfound代替匹配找到。所以当你没找到匹配时,你会再次循环

答案 4 :(得分:0)

您可能希望将布尔值重新初始化为false作为do循环中的第一个语句。否则,如果为userExists分配true进行迭代,则对于所有连续迭代,它将保持true

do
{
   userExists = false;
   matchFound = false;
   System.out.println("Username: ");
   userToAdd = input.next();


}