随笔:in.next()和in.nextLine()的区别以及使用方法

这两个语句都是用来从控制台接受字符串的,区别是:
next(); 这个函数会扫描从有效字符起到空格,Tab,回车等结束字符之间的内容并作为String返回。
nextLine(); 这个函数会直接输出你输入的内容,即使你什么都没输入直接回车他也会输出。
next();什么都不输入直接敲回车不会返回,而nextLine()即使不输入东西直接敲回车也会返回。
当你前面定义了.nextInt();等函数时,nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下一条语句执行。
随笔:in.next()和in.nextLine()的区别以及使用方法
随笔:in.next()和in.nextLine()的区别以及使用方法
就像这个样子,先用nextInt()再用nextLine()就会出现不会有接收字符串的结果。
究其原因,首先,Scanner作为一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。

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

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

随笔:in.next()和in.nextLine()的区别以及使用方法

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

随笔:in.next()和in.nextLine()的区别以及使用方法

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


作者:蓝魔之泪LRD
来源:****
原文:https://blog.****.net/w252064/article/details/78471267
版权声明:本文为博主原创文章,转载请附上博文链接!