首页 文章

使用用户输入在Java中尝试/捕获循环

提问于
浏览
0

我的代码应该从用户获取浮点值输入,一旦用户连续输入2个无效输入(非浮点数),程序就会停止并汇总有效输入并向用户吐出总和 . 这是代码:System.out.println(“请输入一组浮点值 . ”);

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

我的例外是过早抛出,一旦我输入一个无效的输入程序停止并总结 . 我无法弄清楚如何允许用户连续两次无效(非浮点)输入,然后抛出异常 . 谢谢 .

3 回答

  • 1
    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();
        }
    

    抛出异常两次,因为键盘扫描程序中仍有输入,并尝试继续读取 . 通过阅读下一行来“冲洗”它 .

    此外,在输出上,用%f打印它

  • 2

    扫描仪为您提供 hasNexthasNextXXX ,其中XXX是您想要的类型,以避免抛出异常 .

    无论如何,如果用户提供无效输入,它将保持在流中,直到您使用它为止 . 您可以使用 next() 或(有时更好)使用 nextLine() 方法轻松完成此操作 . 所以 avoid using Exceptions as main part of your flow control logic .

    因此,更改您的代码而不是允许任何类型数据的 hasNext ,请使用 hasNextDouble() .
    BTW打印浮点数你需要使用 %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
    
  • 0

    处理此问题的更简单方法是将每个输入行作为字符串(keyboard.nextLine)读取 . 然后尝试Double.parseDouble转换为double,catchinh任何NumberFormatException以检查尝试次数等 .

相关问题