在我的程序中,我将三个单独的 double 作为三个变量的输入。我想测试输入不是 double 时的错误条件。但是,如果我将字符串“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.
最佳答案
第一次调用 in.nextDouble()
时,您的程序会检查 in
是否有 token ,但它没有,所以 - 就像所有 Scanner.hasNext__()
方法 - 它会等待直到获得一个。当您给它字符串输入“test”时,in
现在有了一个 token ,因此可以继续。此时,in.nextDouble()
检查该标记是否是 double 型,但事实并非如此。
我认为您感到困惑的地方是您认为 in.nextDouble()
然后坐着等待,直到它获得双倍。事实并非如此。仅当 in
根本没有 token 时它才会等待。只要 in
有一个标记,它就会评估该标记以查看它是否是 double 型。如果是,它将删除并处理它。如果不是,它只是返回 false 而不删除当前 token 。
当您第二次调用 in.hasNextDouble()
时,它会再次检查 in
是否有 token 。这次确实如此,所以 - 无需等待进一步的输入 - 它会检查该标记是否是 double ,但事实并非如此 - 它仍然是字符串“test”。您的 println()
语句位于条件语句之外,这就是为什么您的提示会打印,但只有您的 else
block 被执行,因为“test”仍然是当前标记,因此所有对 hasNextDouble()
的调用返回 false。
编辑(回应另一个答案)我完全同意@AmirAfghani的建议。您对条件所做的操作(甚至可能使用 hasNextDouble()
而不是简单的 hasNext()
)尚不清楚,让我认为您很困惑关于几件事。也就是说,您要求对这里发生的事情进行解释 - 所以就在这里:)
编辑(响应您的评论)如果“重置它”的意思是删除当前 token ,以便扫描器再次等待第二个 block ,则可以通过简单地调用 in.next()
,它将删除当前 token 而不检查其类型。
关于Java Scanner hasNextDouble() 在第一个实例后无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23796616/