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

Answer

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

Leave a Reply

Your email address will not be published. Required fields are marked *