Do..While循环不断重复,Scanner问题

时间:2016-10-06 15:39:11

标签: java loops do-while

do {   
    System.out.println("Set the A param: ");
    if(input.hasNextDouble() == true) {
        A = input.nextDouble();
        if(A == 0) {
            System.out.println("Param A cannot be a 0!");
        }
    } else if(input.hasNextDouble() == false) {
        System.out.println("Param A must be a number!");
    }
} while(A == 0 || input.hasNextDouble() == false);

你好,我是Java的新手,我发现了一个我自己无法解决的障碍。

一切都没问题,直到我输入一些字母而不是数字,然后这样做.. while循环不断重复。

经过一些搜索,我认为这可能是扫描仪缓冲区的一个问题,因为我应该在每个循环input.nextLine()之前清除它,但我不知道我应该把代码放在哪里。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果input.hasNextDouble()true,您实际上只会从扫描程序消费数据。

目前,如果A == 0并且缓冲区中存在非数字数据,那么您确实无限期地循环。

您需要在所有控制路径上使用缓冲区中的数据。特别是,如果缓冲区中存在非数字的内容,那么您需要使用并立即丢弃它:input.next();就足够了。

答案 1 :(得分:0)

似乎你只想得到A的值,它不应该等于0。阅读评论

double A=0;
do {   
    System.out.println("Set the A param: ");
    if(input.hasNextDouble() == true) { //check for valid value 
        A = input.nextDouble();
        if(A == 0) {
            System.out.println("Param A cannot be a 0!");
        }
    } else{ // no valid value found , print msg and jump over the previous input
        input.nextLine();
        System.out.println("Param A must be a number!");
    }
} while(A == 0); // just check , if the desired value is received 
                 // previously input.hasNextDouble() had no use cuz we already              
                 // checked no double value found so will be false, don't use it 

答案 2 :(得分:0)

首先,你不应该在else if中写相反的支票。只需使用else即可。而且你不应该检查== true,因为该值已经是布尔值。

现在,对于无限循环问题,当hasNextDouble()为false时,表示用户输入了错误(忽略了潜在的流末尾问题)。在这种情况下,您需要丢弃该错误输入,最好通过调用nextLine()来完成。

Java命名约定规定变量应以小写字母开头,因此A应为a

然后您的代码变为:

double a = 0;
do {   
    System.out.println("Set the A param: ");
    if (input.hasNextDouble()) {
        a = input.nextDouble();
        if (a == 0) {
            System.out.println("Param A cannot be a 0!");
        }
    } else {
        input.nextLine(); // discard bad input
        System.out.println("Param A must be a number!");
    }
} while (a == 0);

答案 3 :(得分:0)

首先我写这篇文章后,谢谢你们的回答:

        do
        {   

            System.out.println("Podaj wartość parametru A: ");

            if(input.hasNextDouble() == true)
            {
                A = input.nextDouble();
                if(A == 0)
                {
                    System.out.println("Parametr A nie może być zerem!");
                }
            }
            else if(input.hasNextDouble() == false)
            {
                System.out.println("Parametr A musi być liczbą!");
                input.nextLine();
                A = 0;
            }

        } while(A == 0);

它有效但现在由于第二个答案,我知道如何做得更好。 :) 再次感谢你们两位。

相关问题