Try/Catch 使用用户输入循环 Java

Try/Catch looping in Java with user input

我的代码应该从用户那里获取浮点值输入,一旦用户连续输入 2 个无效输入(非浮点),程序就会停止并对有效输入求和并将总和输出给用户。这是代码: System.out.println("Please input a set of float values.");

    Scanner keyboard = new Scanner(System.in);
    int tries = 0;
    int maxTries = 2;
    double sum = 0;

    while (tries < 2) { 
        try {
             while (keyboard.hasNext()){
                 sum += keyboard.nextDouble();
                 tries = 0; // reset counter because of valid input
             }
        }
        catch (InputMismatchException e) {
            System.out.println("Invalid input. Float values "
                    + "only please.");
            tries += 1; // tries +1 because invalid input
        }
    }
    System.out.printf("The sum of your inputs is: %d", sum);

我的异常被过早抛出,一旦我输入一个无效输入,程序就会停止并进行总结。我不知道如何允许用户连续输入两个无效(非浮点数)然后抛出异常。谢谢

try{
        Scanner keyboard = new Scanner(System.in);
        int tries = 0;
        int maxTries = 2;
        double sum = 0;

        while (tries < 2) { 
            try {
                 while (keyboard.hasNext()){
                     double d = keyboard.nextDouble();
                     sum += d;
                     tries = 0; // reset counter because of valid input
                 }
            }
            catch (InputMismatchException e) {
                System.out.println("Invalid input. Float values "
                        + "only please.");
                tries += 1; // tries +1 because invalid input
                keyboard.nextLine();
            }
        }
        System.out.printf("The sum of your inputs is: %f", sum);
    }catch(Exception e){
        e.printStackTrace();
    }

异常抛出两次,因为键盘扫描器中仍有输入,并试图继续读取。 'flush' 通过阅读下一行。

另外,在输出中,打印一个 %f

Scanner 为您提供 hasNexthasNextXXX,其中 XXX 是您想要准确避免抛出异常的类型。

无论如何,如果用户提供了无效输入,它将一直保持在流中,直到您使用它。您可以使用 next() 或(有时更好)使用 nextLine() 方法轻松完成。所以避免使用异常作为流控制逻辑的主要部分

因此请更改您的代码,使用 hasNextDouble().
而不是允许任何类型数据的 hasNext 顺便说一句,要打印浮点数,您需要使用 %f%d 用于整数。

Scanner keyboard = new Scanner(System.in);
int tries = 0;
int maxTries = 2;
double sum = 0;

while (tries < maxTries) {
    if (keyboard.hasNextDouble()) {
        sum += keyboard.nextDouble();
        tries = 0; // reset counter because of valid input
    } else {
        System.out.println("Invalid input. Float values "
                + "only please.");
        keyboard.next();// consume one invalid token from user input
        tries += 1; // tries +1 because invalid input
    }
}
System.out.printf("The sum of your inputs is: %f", sum);

示例:

输入:1 2 3 b 4 foo bar
输出:

1 2 a 3 a 4 aa a
Invalid input. Float values only please.
Invalid input. Float values only please.
Invalid input. Float values only please.
The sum of your inputs is: 10,000000

更简单的处理方法是将每个输入行作为字符串读取 (keyboard.nextLine)。然后尝试 Double.parseDouble 转换成双精度数,捕获任何 NumberFormatException 以检查尝试次数等