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()
之前清除它,但我不知道我应该把代码放在哪里。
感谢您的帮助。
答案 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);
它有效但现在由于第二个答案,我知道如何做得更好。 :) 再次感谢你们两位。