我不知道为什么,但是当我执行这段代码时,我必须输入一个数字才能将代码转移到下一个代码,而它只需要输入一次。
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);
}
}
答案 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);
...