Exception handling with a do-while loop in Java

一世执手 提交于 2019-12-02 05:20:26

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.

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();
    }

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.

try changing

inputNum = input.nextInt();

to

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

it works perfectly well.

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();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!