让我输入两次数据的错误

时间:2014-08-25 12:46:33

标签: 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);
    }
}

4 个答案:

答案 0 :(得分:0)

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

您可以将代码更改为:

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

答案 1 :(得分:0)

这是hasNextDouble()做的事情

如果使用nextDouble()方法将此扫描仪输入中的下一个标记解释为double值,则返回true。扫描仪不会超过任何输入。

所以它调用nextDouble()检查扫描仪中是否有双, 并且nextDouble()将等待System.in。

因此您需要删除hasNextDouble()并检查nextDouble()之后的l和w的值

答案 2 :(得分:0)

你正在阅读一篇文章,然后问它是否是另一个双倍。

修复以这种方式更改:

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

答案 3 :(得分:0)

您的问题是呼叫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方法,这些输入也需要正的double值。

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