第一个实例后,Java Scanner hasNextDouble()无法正常工作

时间:2014-05-22 01:54:57

标签: java java.util.scanner

在我的程序中,我将三个单独的双打作为三个变量的输入。我想测试输入不是双精度时的错误条件。但是,如果我将字符串“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.

2 个答案:

答案 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)

什么drewmore说是正确的, 一个简单的解决方法是将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;
    }