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

问题描述 投票:1回答:2

我正在尝试创建一个检查整数的函数,并将继续循环,直到用户正确输入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;
}
java input while-loop integer try-catch
2个回答
2
投票

如果下一个可用的输入标记不是整数,则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;
}

0
投票

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

我也在我的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;
        }
<!-- end snippet -->
© www.soinside.com 2019 - 2024. All rights reserved.