方法返回false,但条件匹配,并且应该返回true

时间:2019-04-09 06:19:44

标签: java foreach while-loop enums

我目前有一些User对象,它们的类型为enum enumUserType,但其中之一的enumUserType为LIBRARIAN。图书馆员的用户需要具有特殊权限,在这种情况下,它将具有可以访问的其他菜单。

我尝试执行的操作将遍历用户的数组列表,并且如果该用户的用户类型为图书管理员,则返回true,否则返回false。

经过一些测试之后,即使我的对象中只有一个是图书管理员,整个方法也会返回true。然后,我无法引导不同的用户类型进入不同的菜单路径。 我的第一个对象不是图书馆员,而第二个对象是。

public boolean verifyLibrarian() {
    for (User s : users) {
    //if just one of my objects is librarian it will return true.
        if (s.getUserType() == User.enumUserType.LIBRARIAN) {
            return true;
         }
        else
        {
            return false;
        }
     }
       throw new IllegalArgumentException("Username or password is 
       incorrect");

}

这也是我的while循环:

while(exit == 0)
    {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter your user name");
        String userName = scanner.nextLine();

        System.out.println("Enter your password name");
        String passWord = scanner.nextLine();


         if (library.verifyLogin(userName, passWord)== true && library.verifyLibrarian() != true)
            {
                this.currentLoginUser = userName;
                mainMenuAfterLogin();
            }
   //because my method is returning true, even logged in non librarians 
       //will get lead down to this menu
         else if(library.verifyLogin(userName, passWord) == true && 
         library.verifyLibrarian() == true)
         {
                this.currentLoginUser = userName;
                librarianMenuEditBook();

         }
    }

让我知道是否需要更多信息。 谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您需要将return false放入循环之外,以检查每个用户,然后返回false

for (User s : users) {
//if just one of my objects is librarian it will return true.
    if (s.getUserType() == User.enumUserType.LIBRARIAN) {
        return true;
     }    
}
return false;

或使用anyMatch

return users.stream().anyMatch(s -> s.getUserType() == User.enumUserType.LIBRARIAN);

如果您的意图是在没有找到用户的情况下真正引发异常(当前在您的代码中无法访问,则抛出该异常而不是返回

public boolean verifyLibrarian() {
    for (User s : users) {
    //if just one of my objects is librarian it will return true.
        if (s.getUserType() == User.enumUserType.LIBRARIAN) {
            return true;
        }    
    }
    throw new IllegalArgumentException("Username or password is incorrect");
}

或在流中

users.stream()
      .filter(s -> s.getUserType() == User.enumUserType.LIBRARIAN)
      .findAny()
      .orElseThrow(() -> new IllegalArgumentException("Username or password is incorrect"));