2016-04-25 137 views
-1

我有这种方法在登录之前检查用户的用户名和密码。现在我的for循环仅检查第一个项目,它发现第一个项目u.getRole().equalsIgnoreCase("recruiter")的第一个条件不满足,因此不是检查第二个项目,而是检查第二个项目,然后返回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; 
} 
+2

你有一个'return'语句;你的'if'必须评估为'true'(或你'break')。 –

回答

-1
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. 
+0

为什么你添加冗余继续?循环将继续。 –

+0

现在完美!非常感谢! – userZZZ

+0

@JonnyHenly我添加了,因为如果他需要添加到这个特定的代码,如果更多的逻辑,那么他也可以这样做。 这只是一种意识,你可以添加更多的代码,如果你想.. –

3

那么它是有道理的,因为如果你成功了,你回来,如果你不这样做,你打破,所以它打破:

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;声明。

+0

彻底回答:+1 –

+0

不,不管有没有休息都行不通。我知道我的数据库中的第一项不符合条件,所以它应该继续并检查第二项。我添加了其他{continue;}语句,它完美的工作! – userZZZ

3

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

1

正如已经指出的评论,你只有两个循环的替代品,既能使环路完成(上returnbreak)刚刚起飞的break;陈述或者改变它的continue;

顺便说一句,你为什么不select from User where role = 'recruiter'只?这将使数据库服务器的往返不返回所有用户,但只返回您感兴趣的用户。

1

您的代码和逻辑错误。 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; 
} 
相关问题