Как использовать hasNextInt в Java, чтобы проверить, является ли введенное значение целым или нет?

#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();
}