1

The algorithm should take in 3 integers to an ArrayList. If the input is not an integer, then there should be a prompt. When I execute my code the catch clause is executed, but the program runs into a infinite loop. Could someone guide me into the right direction, I appreciate the help. :-D

package chapter_08;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class IntegerList {
    static List<Integer> numbers = new ArrayList<Integer>();

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int counter = 1;
        int inputNum;

        do {
            System.out.print("Type " + counter + " integer: " );
            try {
                inputNum = input.nextInt();
                numbers.add(inputNum);
                counter += 1;
            }
            catch (Exception exc) {
                System.out.println("invalid number");
            }
        } while (!(numbers.size() == 3));
    }
}

5 Answers 5

3

That is because when the next int is read using nextInt() and it fails, the Scanner still contains the typed contents. Then, when re-entering the do-while loop, input.nextInt() tries to parse it again with the same contents.

You need to 'flush' the Scanner contents with nextLine():

catch (Exception exc) {
    input.nextLine();
    System.out.println("invalid number");
}

Notes:

  • You can remove the counter variable, because you're not using it. Otherwise, you could replace counter += 1 by counter++.
  • You can replace while (!(numbers.size() == 3)) with while (numbers.size() != 3), or even better: while (numbers.size() < 3).
  • When catching exceptions, you should be as specific as possible, unless you have a very good reason to do otherwise. Exception should be replaced by InputMismatchException in your case.
Sign up to request clarification or add additional context in comments.

Comments

1

If inputNum = input.nextInt(); cannot be fit into an int and a InputMismatchException is raised, the input of the Scanner is not consumed.

So after the catch, it loops and it goes again here :

inputNum = input.nextInt();

with exactly the same content in the input.

So you should execute input.nextLine(); in the catch statement to discard the current input and allow a new input from the user.
Besides it makes more sense to catch InputMismatchException rather than Exception as other exception with no relation with a mismatch could occur and it would not be useful to display to the user "invalid number " if it is not the issue :

    catch (InputMismatchException e){
        System.out.println("invalid number ");
        input.nextLine();
    }

Comments

0

You should to use a break; in your catch(){} like so :

try {
    inputNum = input.nextInt();
    numbers.add(inputNum);
    counter += 1;
} catch (Exception e) {
    System.out.println("invalid number ");
    break;
}

So if one input is not correct break your loop.

Comments

0

try changing

inputNum = input.nextInt();

to

String inputText=input.next();
inputNum = Integer.valueOf(inputText);

it works perfectly well.

Comments

0

You need to move the scanner to the next line. Add this line of code below the error message in the catch section.

input.nextLine();

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.