细节!关于Java中的next与nextLine

目录

一、发现问题

 二、解决问题

(1)输入连续字符串

(2)输入不连续字符(含有空格等)

(3)nextLine()方法在前,next()方法在后

(4)next()方法在前,nextLine()在后

三、分析与总结


一、发现问题

大家编写代码时可能会碰到下面这个问题!编写实验四添加学生信息的方法代码,我最初是使用nextLine(),但因为是首先输入姓名(字符串类型),所以并没有出现问题;但在对代码进行“学号已存在”情况的处理后,不得不将学号的输入放在了最前面,这时出现了下面的问题(无法输入姓名)。

 二、解决问题

那么如何解决这个问题呢?这需要进一步了解它们的差别。

下面是几种同时使用next()和nextLine()但调用顺序不一致的情况,代码的运行结果如下:

(1)输入连续字符串

结果正常

(2)输入不连续字符(含有空格等)

结果:next()方法在空格后的"世界“字符未能读入

(3)nextLine()方法在前,next()方法在后

 (4)next()方法在前,nextLine()在后

结果:空格后的“世界”字符留在了缓冲区,被nextLine()方法输出

**此处类似于C语言的getchar()读取缓冲区的内容

这里的nextLine()就没有输出任何数据

三、分析与总结

观察几个结果,可以发现它们各自的特点和彼此之间的差异:

1.next() :

(1)只能读取有效字符,对有效字符出现之前的所有空格,next() 将自动忽略。

(2)从有效字符出现开始,将其后输入的空格键、Tab键和Enter键等视为分隔符或结束符。

2.nextLine():

(1)读取Enter键出现之前的所有字符,包括带空格的字符。

(2)只能以Enter键作为结束符。

其实我们可以查看API

分析后可以发现问题的出现是因为next()或next Int()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,但不输出不代表没数据,是接到了空(回车“/r”)的数据。

最后我们需要来解决问题!

方法一:如果对输入的要求不是很高,比如说输入的内容不会出现空格等,直接将nextLine()改成next()即可。实验四对姓名的输入就可以采取这种方法。

方法二:在每一个 next()、nextDouble()  、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。如下

整理日期:2022-04-07

分享结束,感谢阅读!

水平有限,恳请指教~

猜你喜欢

转载自blog.csdn.net/m0_64198455/article/details/128433128