6

I want the user to enter a number which is scanned by the following code:

scanner.nextInt();

If a user enters a string instead, the program throws InputMismatchException, which is obvious. I want to catch the exception in such a way that the program prompts the user to enter an input until the user enters an integer value.

Scanner scanner = new Scanner(System.in);
while(true) {
    try {
        System.out.println("Please enter a number: ");
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        continue;
    }
}

This code creates an infinite loop if a string is entered.

Jamal
  • 747
  • 7
  • 22
  • 31
h-rai
  • 2,496
  • 4
  • 43
  • 63

3 Answers3

4

The answer to my problem is as follows:

Scanner scanner = new Scanner(System.in);
while(true) {
    try {
        System.out.println("Please enter a number: ");
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        scanner.next();//new piece of code which parses the wrong input and clears the //scanner for new input
        continue;
    }
}
h-rai
  • 2,496
  • 4
  • 43
  • 63
3

Put Scanner scanner = new Scanner(System.in); within your while loop.

Scanner scanner;
while(true) {    
    try {
        System.out.println("Please enter a number: ");
        scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        System.out.println(input);
        //statements
        break;
    }
    catch(InputMismatchException | NumberFormatException ex ) {
        System.out.println("I said a number...");
    }
}
sp00m
  • 44,266
  • 23
  • 127
  • 230
  • what you said works but I have defined the scanner object out side the method itself. In other words, it's a class variable. Is there a way to do so without creating the object within the try-catch statement? – h-rai Aug 30 '12 at 07:05
  • Of course, just reinstanciate the same object each loop. See the edit. – sp00m Aug 30 '12 at 08:04
0

How about this?

while(true) {    
    try {
        System.out.println("Please enter a number: ");
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        System.out.println("\n\nEntered number is : " + input);
        break;
    } catch(InputMismatchException | NumberFormatException ex ) {
        System.out.println("\n\nInput was not a number. Please enter number again : ");
    } catch(Exception e ) {
        System.out.println("\n\nException caught :: " + e);
    }
}

I have also removed continue syntax as those are not needed.

Fahim Parkar
  • 28,922
  • 40
  • 153
  • 260