Попытка предложить пользователю повторно войти из блока catch, но блок catch завершается? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь написать программу, чтобы попросить пользователя ввести свой возраст и предложить ввести его повторно, если они введут неправильное значение (например, отрицательное число, старше 120, возраст со специальными символами или буквами,номер вне диапазона и т. д. ...)

Я попытался написать попытку / перехватить, чтобы попросить пользователя повторно ввести свой возраст:

System.out.println("Enter your age (a positive integer): ");
    int num;

    try {
        num = in.nextInt();
        while (num < 0 || num > 120) {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
            num = in.nextInt();
        }
    } catch (InputMismatchException e) {
        //System.out.println(e);
        System.out.println("Bad age. Re-enter your age (a positive integer): ");
        num = in.nextInt();
    }

Когда введенный возраст содержит специальные символы/ букв или находится за пределами допустимого диапазона, программа выводит слова «Плохой возраст. Повторно введите свой возраст (положительное целое число)», однако сразу же завершается с этой ошибкой:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at Age.main(Age.java:21)

MyЦель состоит в том, чтобы программа продолжала запрашивать допустимый возраст, пока пользователь не получит свое право.Буду очень признателен за любые отзывы и помощь.Я новичок в Java :) Спасибо

Я пытался изменить, поместил весь код в цикл while, но затем он вызвал бесконечный цикл ... пожалуйста, помогите!

while (num < 0 || num > 120) {
        try {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
            num = in.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Bad age. Re-enter your age (a positive integer): ");
        }
    }

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Так как вы пытаетесь захватить недопустимое состояние ввода, все еще запрашивая у пользователя правильное значение, try-catch должен быть инкапсулирован в loop как часть процесса проверки.

При чтении ввода с использованием nextInt недопустимый ввод не удаляется, поэтому вам необходимо убедиться, что вы очистили буфер, прежде чем пытаться перечитать его, используя nextLine. Или вы можете просто отказаться от него и просто прочитать значение String, используя nextLine напрямую, а затем преобразовать его в int, используя Integer.parseInt, что, лично лично, менее проблематично.

Scanner scanner = new Scanner(System.in);
int age = -1;
do {
    try {
        System.out.print("Enter ago between 0 and 250 years: ");
        String text = scanner.nextLine(); // Solves dangling new line
        age = Integer.parseInt(text);
        if (age < 0 || age > 250) {
            System.out.println("Invalid age, must be between 0 and 250");
        }
    } catch (NumberFormatException ime) {
        System.out.println("Invalid input - numbers only please");
    }
} while (age < 0 || age > 250);

Использует цикл do-while, в основном потому, что вы должны выполнить итерацию хотя бы один раз даже для действительного значения при первом проходе

0 голосов
/ 18 сентября 2018

Даже если бы вы могли предложить пользователю повторно ввести свой возраст, вы не сможете проверить, правильно ли введен впоследствии. Поэтому я бы рекомендовал использовать простой цикл while, как вы это делаете, но вместо того, чтобы искать только диапазон чисел, проверьте, является ли это число, прежде чем пытаться проанализировать его в int.

Если вы используете input.nextLine (). Trim (); например, вы можете использовать такие методы, как StringUtils.isNumeric, или вы можете реализовать свой собственный метод для возврата логического значения, указывающего, является ли ввод числовым.

...