为什么我必须输入两个输入才能使我的代码开始运行?

时间:2019-10-08 21:17:19

标签: java java.util.scanner

我在代码中使用了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后的输出为 在下一行“输入数字(键入“停止”以停止):”(因为程序循环不断提示输入数字),然后用户可以根据需要继续输入数字。    相反,实际输出是在用户输入的原始提示下的空白行,用户必须在其中输入所需的再次输入,程序才能开始循环。

3 个答案:

答案 0 :(得分:1)

我认为您应该颠倒代码的逻辑,假设您正在使用扫描仪,请尝试如下操作:

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();
    }
}

基本上,您首先要检查输入类型,然后才从控制台收集值。按照您现在的方式进行操作,您总是会要求第二个输入。

答案 1 :(得分:1)

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

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

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

  

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

为了回答下一个输入是否为double的是/否,扫描仪必须等待用户输入才能继续。

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

答案 2 :(得分:0)

我不太了解API,但是我希望hasNextDouble会读取另一行。检查originalInput是否为double,不要阅读另一行。

相关问题