Почему мой do-while l oop становится бесконечным l oop после ввода недопустимого ввода с помощью сканера Java? - PullRequest
0 голосов
/ 28 мая 2020

Когда вы вводите что-либо, кроме числа, он навсегда выводит мой «Неверный ответ:». Но когда вы набираете номер, он go переходит к следующему (работает правильно).

Я не понимаю, почему он постоянно выводит мое сообщение об ошибке, когда он не проходит проверку. Вместо этого я хочу, чтобы он снова попросил пользователя ввести данные.

Если вы знаете более эффективный способ, пожалуйста, помогите мне.

public class Test {

    public static void main(String[] args) {
        //Scanner getting input
        Scanner nin = new Scanner(System.in); //input for numbers
        Scanner sin = new Scanner(System.in); //input for yes or no

        //initialize variables
        String input = "";
        boolean valid = false;
        boolean playAgain = false;

        //Primary Do While
        do {
            System.out.println("This program will ask for three numbers and see which one is the largest\n");
            System.out.println("\n\n");

            //define the range
            int num1 = 0;
            int num2 = 0;
            int num3 = 0;
            int largestNum = 0;

            //numeric input validation who while loop for the first number
            do {
                System.out.println("Please enter the frist number: ");

                //if block to check if input is valid
                if (nin.hasNextInt()) {
                    num1 = nin.nextInt();
                    valid = true;
                } else {
                    System.out.println("Invalid response: Please enter a whole number.\n\n");
                    valid = false;
                    nin.hasNext();
                }


            } while (!valid); //if false run the loop
            valid = false; //this resets the validity for the next number

            //numeric input validation who while loop for the second number
            do {
                System.out.println("Please enter the second number: ");

                //if block to check if input is valid
                if (nin.hasNextInt()) {
                    num2 = nin.nextInt();
                    valid = true;
                } else {
                    System.out.println("Invalid response: Please enter a whole number.\n\n");
                    valid = false;
                    nin.hasNext();
                }

            } while (!valid); //if false run the loop
            valid = false; //this resets the validity for the next number

            //numeric input validation who while loop for the third number
            do {
                System.out.println("Please enter the second number: ");

                //if block to check if input is valid
                if (nin.hasNextInt()) {
                    num3 = nin.nextInt();
                    valid = true;
                } else {
                    System.out.println("Invalid response: Please enter a whole number.\n\n");
                    valid = false;
                    nin.hasNext();
                }

            } while (!valid); //if false run the loop


            //passing numbers to method and saving results to variable 
            largestNum = largestNum(num1, num2, num3);

            //printing the results
            System.out.println(largestNum);


        } while (!playAgain);


    }

    private static int largestNum(int num1, int num2, int num3) {
        if (num1 > num2 && num1 > 3) {
            return num1;
        } else if (num2 > num1 && num2 > num3) {
            return num2;
        } else {
            return num3;
        }

    }

}

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Во-первых, вам не нужны 2 Scanner объекта, потому что вы читаете из одного и того же места.

Помните - все, что вам нужно прочитать, достаточно одного Scanner на файл!

Но настоящая проблема в том, что вы не очищаете недопустимый ввод пользователя. Метод hasNext только проверяет, есть ли еще входные данные, готовые к обработке, но ничего не делает с ними.

Если вы обнаружите, что входные данные еще есть, но это не целое число (hasNext возвращает true но hasNextInt возвращает false), вы должны вызвать метод next, чтобы получить оставшийся ввод независимо от типа (игнорируя возвращаемое значение).

Кроме того, поскольку вам нужно 3 идентичных цикла, лучше просто поместить один l oop в отдельный частный метод, который будет возвращать значение, а затем вызвать этот метод 3 раза.

privat int getNumberFromUser() {
    do {
        //your loop code here
    } while (!valid);

    return num;
}

//in main:
num1 = getNumberFromUser();
num2 = getNumberFromUser();
num3 = getNumberFromUser();
0 голосов
/ 28 мая 2020

Ваш код на самом деле никогда не читает неверный ввод, поскольку он считывает действительный ввод с использованием nextInt. (hasNext просто сообщает, есть ли ввод для чтения.)

...