|
大家在初学java的时候不知道有没有遇见这种情况
想输入一个人的个人信息时,在nextInt()接收输入的
数字后,后面的nextLine()就会不等键盘输入被跳过
执行。这是为什么呢?
Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。
nextInt()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
(经过我的试验,nextInt(),nextFloat(),nextDouble(),nextBoolen(),nextLong()等接收数值的方法,甚至同为接收字符串的next()方法都是这样),
但是,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。
了解了这两个方法特性和区别,就知道了上边的代码究竟是怎么回事,以及知道了解决的方法。像是上边的代码nextInt()方法之后在缓冲区中留下了“\r”,然后nextLine()方法再去缓冲区找数据的时候首先看到了“\r”,然后就把这个“\r”扫描接收进来,并在缓冲区内清除掉。其实,nextLine()方法是执行过的,并没有不执行。
所以解决的方法
1.在nextInt()方法后面先接一个nextLine()接收在缓冲区的空白符
再写真正用来接收键盘输入的nextLine()方法。也就是一共有两个nextLine()方法。
2.使用next()代替nextLine()方法接收字符串。
为什么nextLine()会跳过执行但是next()不会呢?
这里就要说一下next()与nextLine()的区别了。
next()
1、一定要读取到有效字符后才可以输入。
2、对输入有效字符之前的空白,next()方法会自动将它去掉(所以next()不会受到之前nextInt()留在缓冲区的空白符发的影响)。
3、只有输入有效字符后才将其后面的空白作为分隔符或结束符。
4、next()不能得到带有空格的字符串。
nextLine()
1、以Enter为结束符,nextLine()方法返回的是输入回车之前的所以字符。
2、可以获得空白。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|