简体   繁体   中英

Trying to prompt the user to re-enter from the catch block, but the catch block terminates?

I am trying to write a program to ask a user to enter their age and prompt them to re-enter if they enter an improper value (such as a negative number, older than 120, an age with special characters or letters, an out of range number etc...)

I tried writing a try/catch to ask the user to re-enter their age:

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

When the age entered contains special characters/letters or is out of range, the program DOES print out the words "Bad age. Re-enter your age (a positive integer)," however it immediately terminates thereafter with this error:

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 goal is to get the program to continue prompting for a valid age until the user gets its right. I would really appreciate any feedback and help. I am a java beginner :) Thank you

I tried to change put the whole code into a while loop but then it causes an infinite loop... please help!

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): ");
        }
    }

Since you're trying to capture an invalid input state while still prompting the user for a correct value, the try-catch should be encapsulated within the loop as part of it's validation process.

When reading input using nextInt , invalid input is not removed, so you will need to ensure that you clear the buffer before attempting to re-read it, using nextLine . Or you could just forego it and just read the String value using nextLine directly and then convert it to an int using Integer.parseInt , which is, personally, less troublesome.

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);

The uses a do-while loop, basically because, you have to iterate at least once even for a valid value on the first pass

Even if you were able to prompt the user to re-enter his age, you would not be able to check wheter the input is correct afterwards. Therefore, I would recommend using a simple while loop, like you are doing, but instead of looking only for a range of number, check whether or not it is a number before trying to parse it in int.

If you use input.nextLine().trim(); for instance, you could use methods such as StringUtils.isNumeric or you could implement your own method to return a boolean value indicating if the input is numeric.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM