让我输入两次数据的Bug

  • 本文关键字:两次 数据 Bug java
  • 更新时间 :
  • 英文 :


我不知道为什么,但是当我执行这段代码时,我必须在代码移动到下一段之前输入两次数字,而它应该只需要输入一次。

import java.util.Scanner;
public class Rectangle {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Scanner reader = new Scanner(System.in);
        double l;  //length
        double w;  //width
        double p;  //perimeter
        double a;  //area
        boolean r = true;
        boolean run = true;
        System.out.print("Please Enter the Length of the Rectangle: ");
        do {
            l = scanner.nextDouble();
            if (!(scanner.hasNextDouble())) {
                System.out.println("Please Enter A Number");
                scanner.next();
            } else if (l <= 0) {
                System.out.println("Please Enter a Number Which Is Greater Than 0");
                scanner.next();
            } else {
                double length = l;
                System.out.print("Please Enter the Width of the Rectangle: ");
                w = reader.nextDouble();
                if (!(reader.hasNextDouble())) {
                    System.out.println("Please Enter A Number");
                    reader.next();
                    run = true;
                } else if (w <= 0) {
                    System.out.println("Please Enter a Number Which Is Greater Than 0");
                    reader.next();
                    run = true;
                } else {
                    double width = w;
                    r = false;
                }
                a = l * w;
                p = (2 * l) + (2 * w);
                System.out.println("The Area of the Rectangle is " + a);
                System.out.println("The Perimeter of the Rectangle is " + p);
                run = false;
                break;
            }
        } while (run);
    }
}

scanner.hasNextDouble等待缓冲区中的一些输入,如果它是空的。所以你等待了两次(第一次是nextDouble,第二次是hasNextDouble)

你可以这样修改你的代码:

if (scanner.hasNextDouble()) {
    l = Double.parseDouble(scanner.next());
    ......
}
else {
   // ERROR...
}

hasNextDouble()就是这样做的

如果该扫描器输入中的下一个令牌可以使用nextDouble()方法解释为双精度值,则返回true。扫描器不会超过任何输入。

所以它调用nextDouble()来检查扫描器中是否有double,和nextDouble()将等待System.in.

所以你需要删除hasNextDouble()并检查nextDouble()

之后的l和w的值

你正在读取一个double和AFTER IT,询问它是否是另一个double。

修复了这个问题:

if(!(scanner.hasNextDouble()))
    {
       ....
    }
l = scanner.nextDouble();

您的问题是调用scanner.nextDouble()scanner.next()将等待用户输入,所以当您只想读取一个输入时,您不想同时调用这两个。

您要做的是创建一个助手方法getNextPositiveDouble(),它将处理错误的用户输入,循环直到获得有效的输入,然后返回一个正值。这样你就不会弄乱你的主程序逻辑,而且更容易推理(想想干净的代码)。

我们来分析一下。

如何无限循环,直到从扫描器获得Double类型?

while(!scanner.hasNextDouble()) {
    System.out.println("Please Enter A Number");
    scanner.next();
}
如果

已经执行,那么如何验证Double是正的呢?

Double temp = scanner.nextDouble();
if(temp <= 0) {
    System.out.println("Please Enter a Number Which Is Greater Than 0");
}

显然我们需要循环直到我们得到一个正值所以让我们把这两个代码片段放在一起到辅助函数

private static Double getNextPositiveDouble(Scanner scanner) {
    Double dbl = null;
    while(dbl == null) {
        while(!scanner.hasNextDouble()) {
            System.out.println("Please Enter A Number");
            scanner.next();
        }
        Double temp = scanner.nextDouble();
        if(temp <= 0) {
            System.out.println("Please Enter a Number Which Is Greater Than 0");
        }
        else {
            dbl = temp;
        }
    }
    return dbl;
}

现在您的现有代码只需要像这样调用这个方法,并且您可以为其他需要正双精度值的输入重用helper方法。

...
System.out.print("Please Enter the Length of the Rectangle: ");
do {
    l = getNextPositiveDouble(scanner);
    ...

最新更新