【问题标题】:Why do I have to enter two inputs for my code to start running?为什么我必须输入两个输入才能让我的代码开始运行?
【发布时间】:2019-10-09 06:03:07
【问题描述】:

我在我的代码中使用了一个while 语句,其中,在while 语句中,用户输入了一个数字。要停止程序循环,用户必须输入单词“stop”。但是,一旦我输入了一个数字,输出就会跳到另一行而不打印我想要它打印的语句,我必须再次输入我想要的输入,程序才能开始循环。 唯一不会出现此问题的情况是用户先输入“停止”,然后代码可以正常工作。

这是查找任意数量的用户输入数字的最大值、最小值和平均值。我已尝试更改 else/if 语句的顺序以及所述 else/if 语句的参数,但似乎没有任何效果。

    boolean stopped = false;

    int numberAmount = 0;
    int invalidAmount = 0;

    double max = Integer.MIN_VALUE;
    double min = Integer.MAX_VALUE;
    double mean = 0;        

    while(stopped == false)
    {   
        System.out.print("Enter a number (type "+"\""+"stop"+"\""+" to stop): ");
        String originalInput = userInput.nextLine();

        if(originalInput.equals("stop"))
        {
            stopped = true;
            invalidAmount ++;
            System.out.println(numberAmount+" numbers were entered with "+invalidAmount+" invalid inputs.");
        }

        else if(userInput.hasNextDouble())
        {
            double currentValue = Double.parseDouble(originalInput);
            max = Math.max(max, currentValue);
            min = Math.min(min, currentValue);
            mean = currentValue;
            numberAmount ++;
        }

        else if(originalInput.equals("stop") == false)
        {
            System.out.println("Not a number...");
            invalidAmount ++;
        }
    }


    System.out.println("The maximum is "+max+".");
    System.out.println("The minimum is "+min+".");
    System.out.println("The mean is "+(mean / numberAmount)+".");

    userInput.close();

}

}

例如,我希望输入 7 后的输出是 “输入一个数字(输入“停止”停止):”在下一行(因为程序循环不断提示输入数字),然后用户可以继续输入他们喜欢的数字。 相反,实际输出是用户输入的原始提示下的一个空行,用户必须再次输入他们想要的输入,程序才能开始循环。

【问题讨论】:

  • 方法有什么NextDouble() 做什么? previous read line 是否看起来是双精度的? javadoc 是怎么说的?
  • 啊,这是我的问题,愚蠢的错误。如何在 else if 语句中检查用户输入是否为双精度?
  • 一开始您不会读取一行内容,而是在读取任何内容之前调用 hasNextDouble()。如果它返回 true,你就知道有一个 double 并且你使用 nextDouble() 读取了 id。如果它返回 false,则读取该行并将其与“stop”进行比较。
  • @DanielLiu 翻阅了 Double#parseDouble 的 JavaDoc,尤其是它在发生错误时抛出的内容。
  • @JBNizet 知道了,谢谢!

标签: java java.util.scanner


【解决方案1】:

您没有在代码示例中指定userInput 是什么,但从用法来看,它看起来是Scanner 的一个实例。如果您声明了Scanner,然后调用hasNextDouble(),您将得到一个符合您使用情况的布尔结果——您将其作为if 语句中的条件。

Scanner userInput = new Scanner(System.in);
boolean b = userInput.hasNextDouble();

图片中缺少的是hasNextDouble() 的工作原理。看着Javadoc for Scanner

如果此扫描器输入中的下一个标记可以使用 nextDouble() 方法解释为双精度值,则返回 true。扫描仪不会超过任何输入。

为了回答下一个输入是否为双精度的真/假,扫描器必须等待用户输入才能继续。

所有这一切都是为了说明:您的代码看起来表现正常。如果您不想等待用户输入,则需要编写代码来反映这一点。

【讨论】:

【解决方案2】:

我认为你应该颠倒代码的逻辑,假设你使用的是 Scanner,试试这样:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        boolean stopped = false;

        int numberAmount = 0;
        int invalidAmount = 0;

        double max = Integer.MIN_VALUE;
        double min = Integer.MAX_VALUE;
        double mean = 0;

        while (stopped == false) {

            Scanner userInput = new Scanner(System.in);
            System.out.print("Enter a number (type " + "\"" + "stop" + "\"" + " to stop): ");

            if (userInput.hasNextDouble()) {
                double currentValue = userInput.nextDouble();
                max = Math.max(max, currentValue);
                min = Math.min(min, currentValue);
                mean = currentValue;
                numberAmount++;

            } else {
                String originalInput = userInput.nextLine();
                if (originalInput.equals("stop")) {
                    stopped = true;
                    invalidAmount++;
                    System.out.println(numberAmount + " numbers were entered with " + invalidAmount + " invalid inputs.");
                } else {
                    System.out.println("Not a number...");
                    invalidAmount++;
                }
            }
        }


        System.out.println("The maximum is " + max + ".");
        System.out.println("The minimum is " + min + ".");
        System.out.println("The mean is " + (mean / numberAmount) + ".");

        // userInput.close();
    }
}

基本上,您首先检查输入类型,并且仅在您从控制台收集值之后。以你现在的方式去做,你总是会要求第二个输入。

【讨论】:

  • 很高兴它有帮助!
【解决方案3】:

我并不真正了解 API,但我希望 hasNextDouble 读取另一行。检查 originalInput 是否为双精度,不要读取另一行。

【讨论】:

  • 是的,刚刚发现hasNextDouble是问题所在,但是我不知道如何检查originalInput是否为double。
  • 别想了,把它传递给Double构造函数并捕获数字格式异常。
  • 澄清一下,我没有否决你的答案,在我看到它之前就被否决了。我不知道你为什么被否决,你的回答让我意识到我的错误。谢谢你的建议!
  • 谢谢!正如@kaan 所说,您可以接受或投票。
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多