黑马程序员技术交流社区
标题:
【厦门校区】被nextLine()吃掉的回车键
[打印本页]
作者:
吴洪标
时间:
2018-12-1 21:32
标题:
【厦门校区】被nextLine()吃掉的回车键
本帖最后由 吴洪标 于 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
:
"
);
}
}
}
}
idea64_2018-12-01_21-27-26.png
(7.42 KB, 下载次数: 39)
下载附件
2018-12-1 21:27 上传
输入2次回车键,再输入字符串的结果
作者:
一个人一座城0.0
时间:
2018-12-2 20:55
到此一观
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2