3

i have this piece of code. I wanted to return to the beginning of loop and ask for user input again. However, it always loops without stopping to ask for input. What is wrong with my code? thanks

while(true){
    ... 
    try {
        int choice = input.nextInt(); <<---=- this should stop and ask for input, but it always loops without stopping.

    } catch (InputMismatchException e){
        << I want to return to the beginning of loop here >>
    }

}
2
  • 3
    post the whole while loop code. Commented Aug 3, 2014 at 4:18
  • Can you just add continue in the catch block? Commented Aug 3, 2014 at 4:22

6 Answers 6

10

From http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextInt%28int%29 :

"If the translation is successful, the scanner advances past the input that matched."

Ah, but what if the translation is not successful? In that case, the scanner does not advance past any input. The bad input data remains as the next thing to be scanned, so the next iteration of the loop will fail just like the previous one--the loop will keep trying to read the same bad input over and over.

To prevent an infinite loop, you have to advance past the bad data so that you can get to something the scanner can read as an integer. The code snippet below does this by calling input.next():

    Scanner input = new Scanner(System.in);
    while(true){
        try {
            int choice = input.nextInt();
            System.out.println("Input was " + choice);
        } catch (InputMismatchException e){
            String bad_input = input.next();
            System.out.println("Bad input: " + bad_input);
            continue;
        }
    }
Sign up to request clarification or add additional context in comments.

1 Comment

This is the most general answer so +1!
1

You haven't posted anything asking for input,

Scanner input = new Scanner(System.in);
int choice;
while (true) {
  System.out.println("Please enter an int: ");
  if (input.hasNextInt()) {                // <-- Check if there is an int.
    choice = input.nextInt();
    break;
  } else {
    if (!input.hasNext()) {                // <-- Check if there is input.
      System.err.println("No more input");
      System.exit(1);
    }
    // What ever is in the buffer isn't an int, print the error.
    System.out.printf("%s is not an int%n", input.next());
  }
}
// Display the choice.
System.out.printf("choice = %d%n", choice);

Comments

0

Try doing do while loop.

       do
        {
            try
            {

               //get user input
                done = true; 
            } 

            catch (InputMismatchException e)
            {
                System.out.println("The number entered needs to be a int");
            }


        } while (!done);

Comments

0

This should throw and catch the exception and the continue command should send you back to your while loop. you need either a continue or a flag to tell your while when it stops being true.

while(true)
{
try 
{
   int choice = input.nextInt();
   throw new InputMismatchException();

} 
catch (InputMismatchException e)
{
continue;
}
}

Comments

0

Put a line separator in your catch block.

Scanner input = new Scanner(System.in);
while(true)
    {
        try 
        {
            int choice = input.nextInt(); 
        } catch (InputMismatchException e)
        {
            input.next(); // Line separator
        }

    }

Comments

-1

This works fine:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int choice;

        while(true){
            try {
                choice = input.nextInt();
                System.out.println("Your choice: " + choice);
            } catch (InputMismatchException e){
                e.printStackTrace();
            }
        }
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.