Метод возвращает false, но условия совпадают и должны возвращать true - PullRequest
0 голосов
/ 09 апреля 2019

В настоящее время у меня есть некоторые объекты 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 Ответ

2 голосов
/ 09 апреля 2019

Вам нужно поставить 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...