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

标签 java java.util.scanner

在我的程序中,我将三个单独的 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/

相关文章:

java - 为什么Eclipse和maven中的double比较不同?

java - 如何在一个命令中为所有产品风格运行 lint - Android?

java - 代码似乎陷入了潜在的循环

java - Java中如何从字符串中分别提取字符串和整数?

java - Eclipse 找不到 Main_Activity

java - 在 HashMap 中搜索而不是在数据库中搜索

java - Spring Boot 启动停留在 - INFO : Using a shared selector for servlet write/read

java - 将输入扫描到字符数组Java

Java Scanner .nextInt() 跳过输入

java - 如何使用 Java Scanner 读取特定单词?