user3043624
user3043624

Reputation: 5

Infinite looping; do not understand how

In the code below, when I input anything other than an integer value the code does not ask for my input again and just loops the string outputs infinitely. A little help...

    int choice = 0;
    while(choice == 0)
    {
        try
        {
            System.out.println("Start by typing the choice number from above and hitting enter: ");
            choice = input.nextInt();
        }
        catch(Exception e)
        {

        }

        if ((choice == 1) || (choice == 2) || (choice == 3))
        {
            break;
        }
        else
        {
            System.out.println("Invalid choice number. Please carefully type correct option.");
            choice = 0;
        }
    }

Upvotes: 0

Views: 113

Answers (6)

Reanimation
Reanimation

Reputation: 3346

Are you using Scanner(system.in); from the import java.util.Scanner; package? Try adding input.nextLine(); in the catch to clear the value to stop the infinite loop.

public static void main(String[] args) {

int choice = 0;
Scanner input = new Scanner(System.in);

while(choice == 0)
{
    try
    {
        System.out.println("Start by typing the choice number from above and hitting enter: ");
        choice = input.nextInt();
    }
    catch(Exception e)
    {
        input.nextLine();
        System.out.println("Invalid choice number. Please carefully type correct option.");
    }

    if ((choice == 1) || (choice == 2) || (choice == 3))
    {
        break;
    }
    else
    {
        System.out.println("Invalid choice number. Please carefully type correct option.");
        choice = 0;
    }
 }
}

Upvotes: 1

dansalmo
dansalmo

Reputation: 11694

You can simplify and reduce your code as follows:

    int choice;
    System.out.println("Start by typing the choice number from above and hitting enter: ");
    while(true)
    {
        try {
            choice = input.nextInt();
            if ((choice == 1) || (choice == 2) || (choice == 3))
                break;
        } catch(InputMismatchException e) {  // handle only the specific exception
            input.nextLine();                // clear the input
        }
    System.out.println("Invalid choice number. Please carefully type correct option.");
    }

Upvotes: 1

keyser
keyser

Reputation: 19189

When you input a non-integer it will not be consumed. You need to scan past it. This can be done by, for example, adding a input.nextLine() statement to your catch block. This will consume the invalid input and allow your program to read new data.

This will solve your problem:

catch(Exception e)
{
    input.nextLine(); // Consume the invalid line
    System.out.println("Invalid choice number. Please carefully type correct option.");
}

You could also read the line as a string and try to parse it as a number using Scanner.nextLine and Integer.parseInt, but I prefer using nextInt for integers. It makes the purpose of the code more clear (in my opinion).

Upvotes: 3

user2509848
user2509848

Reputation:

The trouble is that you are not consuming the remaining data in the stream. I solved it with the following code, although you will want to document you code better before you use it in a program:

int choice = 0;
while(choice == 0)
{
    try
    {
        System.out.print("Start by typing the choice number from above and hitting enter: ");
        choice = input.nextInt();
    }
    catch(Exception e)
    {
        input.next();
        System.out.println("Invalid choice number. Please carefully type correct option.");
    }

    if ((choice == 1) || (choice == 2) || (choice == 3))
    {
        break;
    }
    choice = 0;
}

Upvotes: 1

fpw
fpw

Reputation: 799

When nextInt is used and the next input is not an int, it will throw an exception but not consume the data, i.e. the next call will return immediately because the data is still present.

You can fix this by calling the skip method with a pattern like [^0-9]* to skip all invalid input. Then an input like "aaa3" would work. If you want to ignore everything, use .* as pattern.

Upvotes: 2

Gayathri
Gayathri

Reputation: 902

Looks like in the line choice = input.nextInt(); choice value is always 0. Print choice soon after that.

Also for non integer value add a condition to break from the loop.

Upvotes: 0

Related Questions