Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使我输入数据两次的错误_Java - Fatal编程技术网

Java 使我输入数据两次的错误

Java 使我输入数据两次的错误,java,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);

我不知道为什么,但当我执行这段代码时,我必须输入两次数字,然后代码才能进入下一段,而它应该只需要输入一次

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);
    }
}
import java.util.Scanner;
公共类矩形{
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
扫描仪阅读器=新扫描仪(System.in);
双l;//长度
双w;//宽度
双p;//周长
双a;//面积
布尔r=真;
布尔运行=真;
System.out.print(“请输入矩形的长度:”);
做{
l=扫描器.nextDouble();
如果(!(scanner.hasNextDouble()){
System.out.println(“请输入一个数字”);
scanner.next();

}else if(l
scanner.hasNextDouble
等待缓冲区中的一些输入,如果缓冲区为空。因此,您需要等待两次(第一次等待
nextDouble
,第二次等待
hasNextDouble

您可以将代码更改为以下内容:

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

这就是
下一步要做的事

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

因此,它调用
nextDouble()
检查扫描仪中是否有双精度, 而
nextDouble()
将等待System.in


因此,您需要删除
hastnextdouble()
,并在
nextDouble()
读取一个双精度后检查l和w的值,然后询问是否是另一个双精度

修正以这种方式更改的问题:

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

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

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

让我们把它分解一下

我们怎样才能无限循环,直到从扫描器得到一个双精度

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

它发生在哪一行?第一台扫描仪上?
l=scanner.nextDouble();
?同样,当逻辑不正常时,您会执行
run=false;
然后执行
while(run)
如果您只想让代码运行一次,为什么还要执行do-while循环?为什么要在同一输入源上创建两个扫描仪?我想您发布的代码也会等待两次。我测试了它,它不会等待两次。但我也不明白他为什么要使用两个不同的扫描仪。。。。
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;
}
...
System.out.print("Please Enter the Length of the Rectangle: ");
do {
    l = getNextPositiveDouble(scanner);
    ...