为什么我的 for 循环只检查第一个元素?

Why does my for loop check only the first element?

我有这个方法可以在登录前检查用户的用户名和密码。现在我的 for 循环只检查第一个项目,它发现第一个条件 u.getRole().equalsIgnoreCase("recruiter") 不满足第一个项目,所以它没有去检查第二个项目,而是打破了 returns null。

为什么会这样?

这是我的方法:

public User check(String userName, String password) throws AdException {

    try {
        begin();
        Query q = getSession().createQuery("from User");
        ArrayList<User> list = (ArrayList<User>) q.list();
        System.out.println("recruiterList is: " + list);

        for (User u: list) {
            System.out.println("Before if user is: " + u);

            if (u.getRole().equalsIgnoreCase("recruiter")) {
                System.out.println("userName 1 is :" + u.getUserName());

                if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
                    System.out.println("After if recruiter is: " + u);
                System.out.println("userName 2 is :" + u.getUserName());

                return u;
            }
            break;      
        }


    } catch (HibernateException e) {
        rollback();
        throw new AdException("Unfound " + userName, e);
    }

    return null;
}

嗯,这是有道理的,因为如果你成功了,你 return 如果你不成功,你就会失败,所以它会失败:

for (User u: list) {
    System.out.println("Before if user is: " + u);
    if (u.getRole().equalsIgnoreCase("recruiter")) {
        // code which returns at the end
        return u;
    }
    break;      
}

只要不满足条件,就会执行 break; 语句(否则你会在到达条件之前 return),这就是为什么你总是只检查第一项。

如果您想检查所有项目,只需从循环中删除 break; 语句。

您在循环中使用了 break 语句。这会导致循环退出。

正如评论中指出的那样,循环中只有两个选择,都可以使循环完成(在 returnbreak 上)只需取消 break; 语句或将其更改为 continue;.

顺便问一下,你为什么不只select from User where role = 'recruiter'?这将使到数据库服务器的往返行程不会到达 return 所有用户,而只会到达您感兴趣的用户。

for (User u: list) {
    if (u.getRole().equalsIgnoreCase("recruiter")) {

  //sysout

 if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
          //2 sysout
        return u;
     }
     break;      //here break statement will exit your loop just after first Iteration.
 }

所以试试这个代码。

 for (User u: list) {
    if (u.getRole().equalsIgnoreCase("recruiter")) {

  //sysout

 if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)){
          //2 sysout
        return u;
    } else{
               //your code if password doesnot matched
       }
      // continue even if more than one recruiter type User Object are in Database.
     }else{
               //your code if user Role doesnot matched
       }

 }   //loop will check all element present in that array. and if it's ROLE is  matched like "Recuriter" then it will check user and password.

你的代码和逻辑是错误的。 ufor-each 循环的迭代期间不会改变,它会在每次迭代后改变。您的 println 语句表明您相信 u 会在第一个嵌套的 if 语句期间发生变化。自:

System.out.println("userName 1 is :" + u.getUserName());

和:

System.out.println("userName 2 is :" + u.getUserName());

出现在同一个if块中,嵌套在for-each循环中:

if (u.getRole().equalsIgnoreCase("recruiter")) {
    System.out.println("userName 1 is :" + u.getUserName());

    if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
        System.out.println("After if recruiter is: " + u);
    System.out.println("userName 2 is :" + u.getUserName());

    return u;
}

您也不需要使用 breakcontinue 语句。您不需要 break 语句,因为您有 return 语句。您不需要 continue 语句,因为循环就是这样做的。

另请注意,没有花括号的 if 语句 ({ ... }) 仅执行其正下方的行。例如:

if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password))
    System.out.println("After if recruiter is: " + u);

您的代码应类似于:

public User check(String userName, String password) throws AdException {

    try {
        begin();
        Query q = getSession().createQuery("from User");
        ArrayList<User> list = (ArrayList<User>) q.list();
        System.out.println("recruiterList is: " + list);

        for (User u: list) {
            System.out.println("Before if user is: " + u);

            if (u.getRole().equalsIgnoreCase("recruiter")) {
                System.out.println("userName 1 is :" + u.getUserName());

                if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
                    System.out.println("After if recruiter is: " + u);
                    // System.out.println("userName 2 is :" + u.getUserName());

                    return u;
                }
            }    
        }

    } catch (HibernateException e) {
        rollback();
        throw new AdException("Unfound " + userName, e);
    }

    return null;
}

如果您想要 println 语句输出当前用户名的索引是什么,那么不要使用 for-each 使用常规 for 循环。例如:

public User check(String userName, String password) throws AdException {

    try {
        begin();
        Query q = getSession().createQuery("from User");
        ArrayList<User> list = (ArrayList<User>) q.list();
        System.out.println("recruiterList is: " + list);

        for (int i = 0; i < list.length; i++) {
            System.out.println("Before if user is: " + u);

            if (u.getRole().equalsIgnoreCase("recruiter")) {
                System.out.println("userName " + (i + 1) + " is :" + u.getUserName());

                if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) {
                    System.out.println("After if recruiter is: " + u);

                    return u;
                }
            }    
        }

    } catch (HibernateException e) {
        rollback();
        throw new AdException("Unfound " + userName, e);
    }

    return null;
}