Exception handling with a do-while loop in Java

后端 未结 5 646
孤街浪徒
孤街浪徒 2021-01-23 12:43

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

相关标签:
5条回答
  • 2021-01-23 13:18

    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.

    0 讨论(0)
  • 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();
        }
    
    0 讨论(0)
  • 2021-01-23 13:25

    try changing

    inputNum = input.nextInt();
    

    to

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

    it works perfectly well.

    0 讨论(0)
  • 2021-01-23 13:30

    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.
    0 讨论(0)
  • 2021-01-23 13:32

    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();
    
    0 讨论(0)
提交回复
热议问题