#java
#java
Вопрос:
Я пытаюсь создать программу, которая просит пользователя ввести возраст и цикл, пока возраст не станет положительным или числом. Когда я ввожу отрицательное число, внешний вид работает, и он просит ввести число снова, но когда я вместо этого ввожу буквы типа «xyz», цикл не работает, и программа вылетает.
public static void firstScannerMethod () {
Scanner scanner = new Scanner(System.in); //importing scanner class
System.out.println("enter your age: ");
boolean hasNextIntAge = scanner.hasNextInt(); //checking to see if next entered value is an integer
int myAge = scanner.nextInt();
scanner.nextLine(); //handling enter
while (myAge < 0 || !hasNextIntAge) { // if age is less than 0 or if age is not an integer, prompt again
System.out.println("invalid age, try again");
System.out.println("enter your age: ");
myAge = scanner.nextInt();
scanner.nextLine();
}
System.out.println("your age is " myAge);
scanner.close();
}
Комментарии:
1. Тщательно продумайте свою логику. В какой точке (точках) процесса должно
hasNextIntAge
быть установлено его значение? В какой момент (точках) это происходит?2. @KarlKnechtel hasNextIntAge получает свое значение (true или false) из следующего ввода no? помогите мне понять, пожалуйста?
3. Посмотрите, где вы проверяете, имеет ли ваш сканер другое значение, и где вы считываете следующее значение со сканера. Посмотрите на порядок, в котором вы выполняете эти шаги.
4. Я надеюсь, что вы вызываете этот метод только один раз или что у вас нет других методов, которые используют Scanner с System.in . Закрытие любого сканера, который использует System.in закрывается System.in , и его практически невозможно снова открыть.
5. @NomadMaker да. только примерный метод. все еще не могу понять логику, хотя
Ответ №1:
Вы не проверяете значение hasNextIntAge перед вызовом метода nextInt . В результате, когда nextInt получает строковое значение, он выдает исключение InputMismatchException . Я обновил ваш код, чтобы установить myAge только в том случае, если ввод является целым числом.
public static void firstScannerMethod () {
Scanner scanner = new Scanner(System.in);
System.out.println("enter your age: ");
while (!scanner.hasNextInt()) {
System.out.println("invalid age, try again");
scanner.next();
}
int myAge = scanner.nextInt();
while (myAge < 0) {
System.out.println("invalid age, try again");
while (!scanner.hasNextInt()) {
System.out.println("invalid age, try again");
scanner.next();
}
myAge = scanner.nextInt();
}
System.out.println("your age is " myAge);
scanner.close();
}