Сканер требует ввода дважды, прежде чем продолжить - PullRequest
0 голосов
/ 15 апреля 2019

Эй, ребята, у меня здесь небольшая странная проблема, я прошу пользователя ввести свой выбор меню, и в зависимости от того, что они выбирают, он вызывает определенный метод.

Я использовал scanner.next ()после некоторого поиска в Google, но по какой-то причине, только когда я ввожу 1 или 2, я нажимаю ввод, а затем снова говорю 1, и тогда это на самом деле работает.Но что странно, что он вызывает опции 3, 4, 5 и 6, сразу же, без необходимости ввода числа дважды.

Я попытался с scanner.nextLine () после scanner.nextInt (), и этоя просто оставляю свой вариант 1 или 2 без результата.

while(exit == 0)
    {

            System.out.println("\n");
            System.out.println("Menu 1: Display fullname of the user \n");
            System.out.println("Menu 2: Display of user information \n");
            System.out.println("Menu 3: Change password \n");
            System.out.println("Menu 4: List all of users in the library full name\n");
            System.out.println("Menu 5: Search for a book\n");
            System.out.println("Press 6 to search for a books location in the library\n");
            System.out.println("Press 0 to exit\n");

            System.out.println("Enter choice: ");
            int menuChoice = scanner.nextInt();
            scanner.next();


                     if(menuChoice == 1)
                    {
                        displayUserFullName();
                    }
                    else if(menuChoice == 2)
                    {
                        displayUserInformation();
                    }

                    else if(menuChoice == 3)
                    {
                        menuForChangePassword();
                    }

                    else if(menuChoice == 4)
                    {
                        displayAllUserInSystem();
                    }
                    else if(menuChoice == 5)
                    {
                        searchBookByISBN();
                    }
                    else if(menuChoice == 6)
                    {
                        searchBookLocation();
                    }
                    else if(menuChoice == 0)
                    {
                        exit = 1;
                    }
}

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 15 апреля 2019
int menuChoice = scanner.nextInt();
scanner.next();

Считайте javadoc для сканера.Он ожидает ввода данных пользователем:

public String next (): [..] Этот метод может блокировать ожидание ввода для сканирования

Итак, в вашей программе выскажем: подождите, пока пользователь наберет и int, затем подождите, пока пользователь наберет что-то.

Удалите scanner.next();, и оно должно работать.

0 голосов
/ 15 апреля 2019

Scanner - это класс парсинга одиночных токенов, например nextInt, nextDouble, nextToken (String). С соответствующими методами тестирования: hasNextInt и так далее. Весь этот анализ вам не нужен, поэтому используйте nextLine для введенной строки или другой класс Reader (InputStreamReader, BufferedReader).

Также вы можете использовать switch вместо if else if.

       String menuChoice = scanner.nextLine();
       switch (menuChoice) {
       case "1":
           displayUserFullName();
           break;
       case "2":
           displayUserInformation();
           break;
       case "3":
           menuForChangePassword();
           break;
       case "4":
           displayAllUserInSystem();
           break;
       case "5":
           searchBookByISBN();
            break;
       case "6":
           searchBookLocation();
           break;
       case "0":
           exit = 1;
           break;
       default:
           System.out.printf("Unknown choice: '%s'%n", menuChoice);
       }

menuChoice будет содержать всю строку без окончания строки.

Вы можете использовать int с Integer.parseInt(menuChoice), но это приведет к NumberFormatException при неправильном вводе, прервав вашу программу. Scanner.nextInt тоже будет висеть, на самом деле нужен hasNextInt().

...