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));
}
}
If
inputNum = input.nextInt();
cannot be fit into an int and aInputMismatchException
is raised, the input of theScanner
is not consumed.So after the catch, it loops and it goes again here :
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 thanException
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 :You need to move the scanner to the next line. Add this line of code below the error message in the catch section.
That is because when the next int is read using
nextInt()
and it fails, theScanner
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 withnextLine()
:Notes:
counter
variable, because you're not using it. Otherwise, you could replacecounter += 1
bycounter++
.while (!(numbers.size() == 3))
withwhile (numbers.size() != 3)
, or even better:while (numbers.size() < 3)
.Exception
should be replaced byInputMismatchException
in your case.You should to use a
break;
in yourcatch(){}
like so :So if one input is not correct break your loop.
try changing
to
it works perfectly well.