Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的do-while循环在使用Java扫描器输入无效输入后变成无限循环?_Java_Do While - Fatal编程技术网

为什么我的do-while循环在使用Java扫描器输入无效输入后变成无限循环?

为什么我的do-while循环在使用Java扫描器输入无效输入后变成无限循环?,java,do-while,Java,Do While,当你输入数字以外的任何东西时,它将永远打印我的“无效响应”。但是,当你输入一个数字时,它将转到下一个(正常工作) 我不明白为什么它在检查失败时不断打印我的错误消息。相反,我希望它再次请求用户输入 如果你知道一个更好更有效的方法,请帮助我 public class Test { public static void main(String[] args) { //Scanner getting input Scanner nin = new Scanner

当你输入数字以外的任何东西时,它将永远打印我的“无效响应”。但是,当你输入一个数字时,它将转到下一个(正常工作)

我不明白为什么它在检查失败时不断打印我的错误消息。相反,我希望它再次请求用户输入

如果你知道一个更好更有效的方法,请帮助我

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

    }

}

您的代码从未实际读取错误输入,因为它使用
nextInt
读取有效输入。(
hasNext
只是告诉您是否有要读取的输入。)

首先,您不需要2个
Scanner
对象,因为您是从同一位置读取的

记住-无论你需要阅读什么,每个文件一个
扫描仪就足够了

但真正的问题是您没有清除无效的用户输入。 方法
hasNext
只检查是否有更多的输入准备好处理,但不做任何处理

如果发现仍有输入,但它不是整数(
hasNext
返回
true
hasNextInt
返回
false
),则应调用方法,以获取剩余的输入,而不考虑类型(忽略返回值)

另外,由于您需要3个相同的循环,因此最好只将一个循环放在一个单独的私有方法中,该方法将返回值,然后调用该方法3次

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

    return num;
}

//in main:
num1 = getNumberFromUser();
num2 = getNumberFromUser();
num3 = getNumberFromUser();

你认为nin.hasNext()
能完成什么?它不应该在错误发生后等待用户输入吗?欢迎使用堆栈溢出。搜索现有Q/a总是值得的,而且有很多Q/a与
java.util.scanner
的正确/错误使用有关。例如,检查这个答案。另外,在使用Java API(如扫描仪)时,检查。还可以看看;)非常感谢你!这真的帮了我的忙,我的java老师用“就是这样”的方式解释了这件事,所以谢谢你用外行的术语解释。谢谢你对扫描仪的澄清,我一直不明白她为什么坚持要两台。。。。。