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(lscanner.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);
...