【问题标题】:Why can't I break my while loop by press 'enter'为什么我不能通过按“输入”来打破我的 while 循环
【发布时间】:2020-02-14 10:26:53
【问题描述】:

请任何人帮助我打破while循环,我只想在用户没有输入任何内容时结束程序,但为什么它不能工作?请帮忙,非常感谢。

import java.util.Random;
import java.util.Scanner;
import java.lang.Math;

public class Determining_Pi_Experiment {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Press 'enter' to exit, or type an integer number indicating for how many times you " +
                    "want the experiment run: ");
            Scanner input = new Scanner(System.in);
            if(!input.equals(null)) {
                if(input.hasNextInt()) {

                    System.out.println("Processing...");
                    Random rand = new Random();
                    int ExperimentTimes = input.nextInt();
                    double count_success = 0;
                    double Pi = 0;

                    for (int i = 0; i < ExperimentTimes; ++i) {

                        double x = rand.nextDouble();
                        double y = rand.nextDouble();

                        double distance = Math.pow(Math.pow((x - 0.5), 2) + Math.pow((y - 0.5), 2), 0.5);

                        if (distance <= 0.5) {
                            ++count_success;
                        }
                    }
                    Pi = (count_success / ExperimentTimes) * 4;
                    System.out.println("Pi is approximately equal to: " + Pi);
                }
                else {
                    System.out.println("Invalid input.");
                }
            }
            else if(input.equals(null)) {
                System.exit(0);
            }
        }
    }
}

【问题讨论】:

  • 你的Scanner(实际上什么都没有)永远不会.equals(null)。这根本不可能,因为在null 上调用.equals 会引发NullPointerException。而且您的Scanner 也不等于String。您必须调用nextFoo() 方法之一。
  • 但是我如何修改它以实现当我按下回车时,它会中断?
  • 如果你只是按回车,那么输入将是一个空字符串"" ?
  • 你的意见是什么?

标签: java loops while-loop


【解决方案1】:

我可以看到你的代码中有很多错误,我会引导你完成它们。

1) 过于复杂、过于冗长、不需要的检查 2) #equals 方法的误用 3) 不遵循标准命名约定 4) 对如何构建输入读取循环的一般误解

扩展它们:

1) 尝试简化您的代码,删除 while true 循环和 else 子句(参见第 4 点),在外部只声明一次变量,删除多余的括号。 此外,距离可以计算为Math.hypot(x1-x2, y1-y2)(参见here

2) 注意equals 方法应该用于检查一个对象是否等于另一个对象。如果在您的示例中返回 true,则意味着扫描仪本身为 null(不是它正在读取的内容),因此检查无法进行,因为会抛出 NullPointerException(在 null 扫描仪上调用方法)。要检查扫描器(或任何对象)是否为空,您需要执行anyObject == null。请注意,这与 Scanner 输入无关(参见第 4 点)。

3)请正确命名变量(see here)。

4) 如果您想继续阅读用户输入,直到没有更多输入可用,您应该使用 Scanner#hasNext 。如果您想在输入空字符串时结束,您确实应该检查该字符串是否为空。这与扫描仪为空无关。 someString.isEmpty() 将为您完成这项工作。

伪循环:

while(scanner.hasNextLine() && !((line = scanner.nextLine()).isEmpty()))
 //do something with the input, stored in the line String

//Exits when enter is pressed (or EOF)

【讨论】:

  • 非常好的答案。
猜你喜欢
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多