【问题标题】:How do I effectively clear a buffer in Java?如何有效地清除 Java 中的缓冲区?
【发布时间】:2018-04-03 20:08:24
【问题描述】:

这是本题主类的方法。

当用户为请求的信息输入非数字值时,我遇到了问题。

示例)

Enter a distance in meters: jam
Incorrect value. Please select a distance in meters greater than zero.

Enter a distance in meters: Incorrect value. Please select a distance greater than zero. 

Enter a distance in meters:

这是调用此方法时发生的输出。我该如何纠正这个问题?

public static double validDistance (String prompt,
                                    double minValue) {

    Scanner keyboard = new Scanner (System.in);
    double value;
    String errorMessage = "Incorrect value. Please select a distance in "
            + "meters greater than zero\n";
    // Protects distance input from incorrect value 
    // (non-numeric or too low)
    do {
        System.out.print(prompt);
        if (keyboard.hasNextDouble()) {
            value = keyboard.nextDouble();
            if (value <= minValue) {
                System.out.println(errorMessage);
            } else {
                break; // Exit loop
            }
        } else {
            System.out.println(errorMessage);
            keyboard.nextLine(); // Clears buffer
        }
    } while (true);
    return value;
}

【问题讨论】:

  • 需要循环提示输入。
  • keyboard.nextLine();移到else之外。

标签: java loops if-statement buffer do-while


【解决方案1】:

我知道这并不能直接回答你的问题。

我个人发现处理Scanner 缓冲区非常烦人,所以我更喜欢逐行阅读并自己进行处理。例如:

public static double validDistance(String prompt, double minValue)
{
    Scanner keyboard = new Scanner(System.in);
    String errorMessage = "Incorrect value. Please select a distance in meters greater than zero\n";
    while (true) {
        System.out.print(prompt);
        String line = keyboard.nextLine();
        try {
            double result = Double.parseDouble(line);
            if (result >= minValue) {
                keyboard.close(); // You should always close a Scanner when you're done!
                return result;
            }
        } catch (NumberFormatException e) {
        }
        System.out.println(errorMessage);
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多