Java Do..当循环不断重复时,扫描仪问题

Java Do..当循环不断重复时,扫描仪问题,java,loops,do-while,Java,Loops,Do While,您好,我是Java新手,我发现了一个自己无法解决的障碍 一切都很好,直到我输入一些字母而不是数字,然后这样做..而循环不断重复自己 经过一些搜索后,我想这可能是扫描仪缓冲区的问题,因为我应该在每次循环之前用input.nextLine()清除它,但我真的不知道应该把它放在代码中的什么位置 谢谢您的帮助。只有当输入.hasNextDouble()为真时,您才实际使用扫描仪中的数据 目前,如果A==0并且缓冲区中存在非数字数据,那么您确实会无限期地循环 您需要在所有控制路径上使用缓冲区中的数据。特别

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

一切都很好,直到我输入一些字母而不是数字,然后这样做..而循环不断重复自己

经过一些搜索后,我想这可能是扫描仪缓冲区的问题,因为我应该在每次循环之前用
input.nextLine()
清除它,但我真的不知道应该把它放在代码中的什么位置

谢谢您的帮助。

只有当
输入.hasNextDouble()
真时,您才实际使用扫描仪中的数据

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


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

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

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

首先,您不应该在
中写入相反的检查,否则如果
。只需使用
else
。您不应该检查
==true
,因为该值已经是布尔值

现在,对于无限循环问题,如果为false,则意味着用户输入了错误的内容(忽略潜在的流结束问题)。在这种情况下,您需要放弃错误的输入,最好通过调用

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

然后,您的代码变成:

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 

谢谢你的两个答案,在我写了这篇文章之后:

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);
这很有效,但多亏了第二个答案,我现在知道如何做得更好了
再次感谢你们两位。

您想做什么?请描述我,然后我将帮助您在
hastnextdouble()返回false时,不能使用
nextDouble()
跳过错误输入。这只会抛出一个
inputmaschException
。老兄,你不必发布你的答案,因为答案已经在这里了,所以只需点击答案旁边的勾号就可以接受你喜欢的答案。是的,但这仍然是一个答案。一个好的。我投了更高的票。这个答案也是高质量的。
        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);