Java Scanner hasNextDouble()不';I don’’第一次尝试后,你就不能正常工作了

Java Scanner hasNextDouble()不';I don’’第一次尝试后,你就不能正常工作了,java,java.util.scanner,Java,Java.util.scanner,在我的程序中,我把三个独立的双精度作为三个变量的输入。我想测试输入不是双精度时的错误条件。但是,如果我将字符串“test”作为第一个变量输入,程序将输出另外两个变量的提示,但不提供输入选项,并快速打印出错误消息 我的问题是,为什么只接受第一个失败的输入,而不测试其他两个 代码: 如果测试失败的输入,将看到以下输出: Please enter the first number: test Please enter the second number: Please enter the third

在我的程序中,我把三个独立的双精度作为三个变量的输入。我想测试输入不是双精度时的错误条件。但是,如果我将字符串“test”作为第一个变量输入,程序将输出另外两个变量的提示,但不提供输入选项,并快速打印出错误消息

我的问题是,为什么只接受第一个失败的输入,而不测试其他两个

代码:

如果测试失败的输入,将看到以下输出:

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.

第一次调用.nextDouble()中的
时,您的程序会检查
中的
是否有一个令牌,而它没有,因此-与所有
扫描仪一样。hasNext\uuuuux()
方法-它会等待,直到获得一个令牌。当您给它一个字符串输入“test”时,
中的
现在有一个令牌,因此将继续。此时,.nextDouble()中的
将检查该令牌是否为double,而不是double

我认为你感到困惑的地方是,你在.nextDouble()中思考
,然后坐在那里等待,直到得到一个双精度。没有。只有在
中的
完全没有令牌时,它才会等待。只要
中的
有一个标记,它就会计算该标记以查看它是否为双精度标记。如果是,则删除并处理它。如果不是,它只返回false而不删除当前令牌

当您第二次调用.hasNextDouble()中的
时,它会再次检查
中的
是否有令牌。这一次,它会这样做,因此,在不等待进一步输入的情况下,它会检查该令牌是否是一个
双精度的
,而事实并非如此-它仍然是字符串“test”。您的
println()
语句超出了您的条件,这就是为什么您会打印提示,但只执行
else
块,因为“test”仍然是当前标记,因此对
hasNextDouble()的所有调用都返回false

编辑(回应另一个答案)我完全同意@AmirAfghani的建议。你对你的条件句做了什么(甚至你使用了
hasNextDouble()
而不是简单地使用
hasNext()
)都不清楚,这让我觉得你对一些事情感到困惑。这就是说,你要求解释这里发生了什么事——那么,给你:)


编辑(回应您的评论)如果“重置它”是指删除当前标记,以便扫描仪在第二个块上再次等待,则只需调用
in.next()
,即可删除当前标记,而无需检查其类型。

drewmore所说的是正确的, 一个简单的修复方法是在.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;
    }

粘贴程序的输出…或仅在调试程序中运行。请输入第一个数字:测试请输入第二个数字:请输入第三个数字:错误:一个或多个值无效。抱歉,此处的输出格式不正确。“测试”后有一个换行符。在再次测试之前有没有办法重置?谢谢您的澄清!现在我看到德雷莫尔完美地回答了我的问题,但我是一个新手,在没有为我解释清楚之前,我是不会意识到这一点的!
    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;
    }