探讨java中Scanner类nextInt之后用nextLine无法读取输入

来源:互联网 发布:中国象棋手机版软件 编辑:程序博客网 时间:2024/06/16 13:03

这里写图片描述

这里写图片描述

就像这个样子,先用nextInt()再用nextLine()就会出现不会有接收字符串的结果。
究其原因,首先,Scanner作为一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。

其次,nextInt()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中,而接下来,nextLine()方法自动读取了被nextInt()丢下来的”\r”作为他的结束符,其实nextLine()方法是执行过的,并不是没有执行。

那么该如何解决这个问题呢?一般有三种方法:
1.可以在nextInt()方法后面多加一句nextLine()方法专门用来取出缓冲区中留下的空白符;

这里写图片描述

2.可以只用nextLine()方法,然后通过Integer类中的parseInt()方法解析成int数据。因为nextLine()方法会自动清理掉后边的空白符,这种方法就不会产生最开始那种错误了;

这里写图片描述

3.将nextLine()换成next(),因为next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。但是next()方法不能得到带空格的字符串。
而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

阅读全文
0 0