在我的程序中,我将三个单独的双打作为三个变量的输入。我想测试输入不是双精度时的错误条件。但是,如果我将字符串“test”作为第一个变量,程序将输出其他两个变量的提示,但不提供输入选项,并快速打印出错误消息。
我的问题是为什么它只采取第一次失败的输入并跳过测试其他两个?
代码:
/*
* This program reads three numbers and provides the following
* conditional outputs:
* "all the same" if all the same
* "all different" if they are all different
* "neither" in all other cases
*/
import java.util.Scanner;
public class P3d4 {
public static void main(String[] args)
{
//initialize variables
double number1 = 0;
double number2 = 0;
double number3 = 0;
boolean failTest = false;
Scanner in = new Scanner(System.in);
//prompt and take input for the three numbers, flagging for
//invalid doubles
System.out.print("Please enter the first number: ");
if (in.hasNextDouble())
{
number1 = in.nextDouble();
}
else
{
failTest = true;
}
System.out.print("Please enter the second number: ");
if (in.hasNextDouble())
{
number2 = in.nextDouble();
}
else
{
failTest = true;
}
System.out.print("Please enter the third number: ");
if (in.hasNextDouble())
{
number3 = in.nextDouble();
}
else
{
failTest = true;
}
//output error if one or more values are invalid,
//otherwise output comparison results
if (failTest == true)
{
System.out.println("Error: One or more of the values are not valid.");
}
else
{
if (number1 == number2 && number2 == number3)
{
System.out.println("The numbers are all the same.");
}
else if (number1 != number2 && number2 != number3 && number1 != number3)
{
System.out.println("The numbers are all different.");
}
else
{
System.out.println("The numbers are neither all different or all the same.");
}
}
}
}
如果测试失败的输入,则会看到以下输出:
Please enter the first number: test
Please enter the second number: Please enter the third number: Error: One or more of the values are not valid.
答案 0 :(得分:1)
第一次调用in.nextDouble()
时,您的程序会检查in
是否有一个令牌,但它没有,所以 - 就像所有Scanner.hasNext__()
方法一样 - 它等到它得到一个。当你给它输入字符串输入" test"时,in
现在有一个令牌,因此继续。此时,in.nextDouble()
检查该令牌是否为双精度,而不是。
我认为你感到困惑的地方在于你认为in.nextDouble()
然后坐着等待它变成双倍。它没有。它仅在in
根本没有令牌时才会等待。只要in
有一个令牌,它就会评估该令牌以查看它是否为双倍。如果是,则删除并处理它。如果没有,它只返回false 而不删除当前令牌。
当您第二次拨打in.hasNextDouble()
时,会再次检查in
是否有令牌。这次它确实如此 - 无需等待进一步的输入 - 它检查该令牌是否是double
,它不是 - 它仍然是字符串" test"。您的println()
语句超出了您的条件,这就是您的提示打印的原因,但只执行了else
个块,因为" test"仍然是当前令牌,因此您对hasNextDouble()
的所有调用都返回false。
编辑(回应另一个答案)我完全赞同@ AmirAfghani的建议。您对条件的处理(甚至可能使用hasNextDouble()
而不仅仅是hasNext()
)还不清楚,这让我觉得您对一些事情感到困惑。那就是说,你要求解释这里发生了什么 - 所以你去吧:)
编辑(回复您的评论)如果通过"重置它"你的意思是删除当前令牌,以便扫描器再次在第二个块上等待,这可以通过简单地调用in.next()
来实现,这将删除当前令牌而不检查其类型。
答案 1 :(得分:1)
in.next();
添加到前2个else
语句中,如下所示:
System.out.print("Please enter the first number: ");
if (in.hasNextDouble())
{
number1 = in.nextDouble();
}
else
{
failTest = true;
in.next();
}
System.out.print("Please enter the second number: ");
if (in.hasNextDouble())
{
number2 = in.nextDouble();
}
else
{
failTest = true;
in.next();
}
System.out.print("Please enter the third number: ");
if (in.hasNextDouble())
{
number3 = in.nextDouble();
}
else
{
failTest = true;
}