如何使用try和catch来保持循环以获得正确的输入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用try和catch来保持循环以获得正确的输入?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个检查整数的函数,并将继续循环,直到用户正确输入17或更高的整数。但是,如果我输入错误的输入,比如'K'或'&',它将陷入无限循环。

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;
}
答案

如果下一个可用的输入标记不是整数,则nextInt()将该输入保留为未消耗,在Scanner内缓冲。这个想法是你可能想尝试用其他Scanner方法读取它,例如nextDouble()。不幸的是,这也意味着除非你做了一些事情来摆脱缓冲的垃圾,你下一次调用nextInt()将会尝试(并且失败)再次读取相同的垃圾。

所以,为了清除垃圾,你需要在尝试再次调用next()之前调用nextLine()nextInt()。这可以确保下次调用nextInt()时,它将使用新数据而不是相同的旧垃圾:

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

我不会将扫描程序传递给您的方法我会尝试重新构造它,并将方法分配给主体中的变量,如下所示:

我也在我的catch中使用递归来调用异常被捕获时的方法,id也建议使用可能的一般异常,使其捕获(异常异常)

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

以上是关于如何使用try和catch来保持循环以获得正确的输入?的主要内容,如果未能解决你的问题,请参考以下文章

为啥尽量不要将try…catch写在循环中?

Node.JS - 无法使用try / catch块获得异步抛出

啪啪,打脸了!领导说:try-catch必须放在循环体外!

啪啪,打脸了!领导说:try-catch必须放在循环体外!

如何在 Swift 中正确获取 Do-Catch 范围之外的值(使用 Try)

如何实现通用 do-try-catch 块以捕获操作中引发的所有错误