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