Почему я не могу сломать свою в то время как l oop, нажав «enter» - PullRequest
0 голосов
/ 14 февраля 2020

Кто-нибудь, пожалуйста, помогите мне с перерывом l oop, я просто хочу завершить программу, когда пользователь ничего не печатает, но почему она не может работать? Пожалуйста, помогите, большое спасибо.

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

1 Ответ

1 голос
/ 14 февраля 2020

Я вижу много ошибок в вашем коде, я проведу вас через них.

1) Слишком сложные, слишком многословные проверки, которые не нужны 2) Неправильное использование метода #equals 3) Несоблюдение стандартных соглашений об именах 4) Общее недопонимание того, как структурировать чтение ввода l oop

Чтобы расширить их:

1) Попытайтесь упростить ваш код, уберите значение while true l oop и предложение else (см. Пункт 4), объявите переменные только один раз, извлеките излишние скобки. Кроме того, расстояние может быть вычислено как Math.hypot(x1-x2, y1-y2) (см. здесь )

2) Обратите внимание, что метод equals должен использоваться для проверки, является ли объект равно другому объекту. Если бы в вашем примере возвращалось значение true, это означало бы, что сам сканер имеет значение null (а не то, что он читает), поэтому проверка не может работать, потому что будет выдано исключение NullPointerException (вызов метода на нулевом сканере). Чтобы проверить, является ли сканер (или какой-либо объект) нулевым, вы вместо этого хотите сделать anyObject == null. Обратите внимание, что это не имеет никакого отношения к входу сканера (см. Пункт 4).

3) Пожалуйста, правильно называйте переменные ( см. Здесь ).

4) Если вы хотите продолжить чтение пользовательского ввода до точки, когда больше нет ввода, вам следует использовать Scanner # hasNext . Если вместо этого вы хотите завершить ввод пустой строки, вам действительно следует проверить, что строка пуста. Это не имеет никакого отношения к сканеру, являющемуся нулевым. someString.isEmpty() сделает всю работу за вас.

Pseudo l oop:

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

//Exits when enter is pressed (or EOF)
...