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 e
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.
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();
}
try changing
inputNum = input.nextInt();
to
String inputText=input.next();
inputNum = Integer.valueOf(inputText);
it works perfectly well.
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:
counter
variable, because you're not using it. Otherwise, you could replace counter += 1
by counter++
.while (!(numbers.size() == 3))
with while (numbers.size() != 3)
, or even better: while (numbers.size() < 3)
.Exception
should be replaced by InputMismatchException
in your case.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();