How to keep looping with try and catch to get correct input?

依然范特西╮ 提交于 2021-01-28 16:42:20

问题


I'm trying to make a function that checks for an integer and will keep looping until the user correctly enters an integer of 17 or higher. However, if I put in wrong input, like 'K', or '&', it will get stuck in an infinite loop.

public static int getAge(Scanner scanner) {
    int age;
    boolean repeat = true;

    while (repeat) {
        try
        {
          System.out.println("Enter the soldier's age: ");
          age = scanner.nextInt();
          repeat = false;
        }
        catch(InputMismatchException exception)
        {
          System.out.println("ERROR: You must enter an age of 17 or higher");
          repeat = true;
        }
    }
    return age;
}

回答1:


If next available input token isn't an integer, nextInt() leaves that input unconsumed, buffered inside the Scanner. The idea is that you might want to try to read it with some other Scanner method, such as nextDouble(). Unfortunately, this also means that unless you do something to get rid of the buffered-up garbage, your next call to nextInt() will will just try (and fail) to read the same junk over again.

So, to flush out the junk, you need to call either next() or nextLine() before trying to call nextInt() again. This ensures that the next time you call nextInt(), it will have new data to work on instead of the same old garbage:

try {
    //...
} 
catch(InputMismatchException exception)
{
    System.out.println("ERROR: You must enter an age of 17 or higher");
    scanner.next();   // or scanner.nextLine()
    repeat = true;
}



回答2:


I would not pass a scanner to your method I would try re structuring it, and assigning the method to a variable in your main like this:

I am also using recursion in my catch to recall the method when the exception is caught, id also recommend using maybe a general exception , making it catch(Exception exception)

  main method call of method
    ---------------------------
        int something= getAge();
        ----------------------------------------------------------

         method structure like this,
    ---------------------------------------------

        public static int getAge() {
            int age;
    age = scanner.nextInt();
            boolean repeat = true;

            while (repeat) {
                try
                {
                  System.out.println("Enter the soldier's age: ");
                  
                   
        if(age<=17){
                  repeat = false;
        }

    if(age>17){


    getAge();
    }
                }
                catch(InputMismatchException exception)
                {
                  System.out.println("ERROR: You must enter an age of 17 or higher");
                  getAge();
                }

            }
            return age;
        }
<!-- end snippet -->


来源:https://stackoverflow.com/questions/47852298/how-to-keep-looping-with-try-and-catch-to-get-correct-input

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