Научитесь читать типобезопасные пользовательские вводы из системной консоли в любом интерактивном приложении Java. Это помогает подсказывать пользователю, пока он не введет значение в правильном формате/типе данных.
1. Причина InputMismatchException
Вы когда-нибудь пробовали использовать класс Scanner для чтения ввода пользователя в вашей интерактивной консольной программе ? Это очень простой код для написания.
Приложение задает пользователю вопрос, пользователь вводит значение и нажимает ENTER. Затем приложение считывает значение с помощью методов Scanner.next().
Давайте рассмотрим пример чтения ввода с консоли с использованием класса Scanner.
Scanner scanner = new Scanner(System.in);System.out.print("Enter your age as an integer : ");int age = scanner.nextInt();System.out.println("Your age is " + age);scanner.close();
Выходные данные вышеуказанной программы зависят от ввода данных пользователем через консоль.
Введите свой возраст как целое число: 10Тебе 10 лет
Введите свой возраст как целое число: десятьИсключение в потоке "main" java.util.InputMismatchExceptionв java.util.Scanner.throwFor(Scanner.java:864)в java.util.Scanner.next(Scanner.java:1485)в java.util.Scanner.nextInt(Scanner.java:2117)в java.util.Scanner.nextInt(Scanner.java:2076)на com.howtodoinjava.examples.TypeSafeInputExample.typeUnsafeReadExample(TypeSafeInputExample.java:19)на com.howtodoinjava.examples.TypeSafeInputExample.main(TypeSafeInputExample.java:9)
Поскольку пользователь ввел неверные, по его мнению, данные, приложение аварийно завершило работу из-за исключения InputMismatchException.
Давайте решим этот вариант использования.
2. Чтение типобезопасных входных данных
Теоретически мы можем сделать нашу программу более надежной, проверив перед чтением, соответствует ли следующий токен нашим ожидаемым входным данным.
Методы Scanner.hasNext() делают то же самое. Эти методы возвращают true, если следующий токен может быть прочитан как запрошенный тип данных.
Например, если мы ожидаем значение int, то вызов Scanner.hasNextInt() вернет true только в том случае, если следующий доступный токен в сканере может быть проанализирован как значение int. В противном случае он вернет false, и мы можем уведомить пользователя о том, что введенное значение недопустимо, и повторно запросить новый ввод.
Давайте рассмотрим приведенное выше решение с использованием кода.
Scanner scanner = new Scanner(System.in);System.out.print("Enter your age : ");while(!scanner.hasNextInt()){scanner.nextLine(); //clear the invalid input before prompting againSystem.out.print("Please enter your age in natural positive number : ");}int age = scanner.nextInt();System.out.println("Your age is " + age);scanner.close();
Enter your age : tenPlease enter your age in natural positive number : 10.5Please enter your age in natural positive number : 10Your age is 10
Используя методы Scanner.hasNextXYZ() и Scanner.nextXYZ(), мы можем написать любое консольное интерактивное Java-приложение, в котором мы можем заставить пользователя вводить только допустимые данные — без сбоя программы.