本帖最后由 吴洪标 于 2018-12-1 21:37 编辑
今天在写一段代码时,用到了Scanner类,在调用nextLine()方法的时候发现,如果前面有nextDouble(),则nextLine()会接收nextDouble()去掉的回车键作为它的结束符,这在循环语句中导致程序被多运行一次。
在下面的代码中,如果在nextLine()中多次输入回车键,那么这些回车键会被缓存起来,等到输入字符串时,nextLine()先接收前面的回车键,再接收字符串,此时打印语句会被连续执行多次。
具体情况看代码及注释。
import java.util.Scanner;
public class OperatorDemo {
public static void main(String[] args) {
ticketForFree();
}
public static void ticketForFree() {
System.out.println("小朋友你多高?");
Scanner scan = new Scanner(System.in);
while (true) {
// 若不输入正确的身高值,就一直问他,直到他输入正确的身高值为止if (scan.hasNextDouble()) {
double h = scan.nextDouble(); // 若在输入双精度浮点型数字之前,先输入了几个回车键,则这几个回车键会被nextDouble()给忽视掉,因此只剩下数字和后面的一个回车键。 String s = scan.nextLine(); // 这行代码可以用来吃掉nextDouble()去掉的回车键
if (h > 0.5 && h < 2.2) { // 判断是否有双精度的数值输入
// 判断身高是否在人类正常范围内double height = h;
if (height < 1.4) {
System.out.println("免费坐车!");
}else {
System.out.println("要买票哦!");
}
break;
} else {
double height = h;
System.out.println(height + "米不是正常人类的身高值,请输入正确的身高值,例如1.5:");
}
} else {
String str = scan.nextLine(); // 这一句,当输入一个边界之外的数值之后,再次输入一个字符串,那么后面的打印输出语句会被执行两次,为什么?
// 因为nextLine()自动读取了被double h = scan.nextDouble()去掉的Enter作为他的结束符,所以没办法给str从键盘输入值。此时程序向下执行输出语句。若在double h = scan.nextDouble()后面再加一句String s = scan.nextLine(),去吃掉那个回车键,则可以正常运行程序。
// 然而,即便如此,若输入时先敲了几个回车键,再输入字符串,则问题同样会产生。这是因为,当直接输入回车键时,因为没有任何输入,所以if-else这两个语句块都不会进入,这时回车键都在缓存里存着。这时候再输入字符串,那么 这几个回车键就都被else语句块中的nextLine()捕捉到,这时候多次触发了后面的打印语句。
// 所以最好的解决方案是在这里使用next()而不是nextLine()。System.out.println(str + "不是一个数字,请输入正确的身高值,例如1.6:");
}
}
}
}
|
|