关于这个问题之前也看过别人写的文章,以为自己明白了,结果今天练习时发现还是混乱的,特此记录一下,也给同样还没搞懂的朋友一点参考。 测试代码如下:
import java.util.Scanner; public class Text{ private Text(){ System.out.println("您已创建成功"); } public static void main(String[] args){ Text text=new Text(); Scanner sc=new Scanner(System.in); System.out.print("请输入:"); String s=sc.next(); System.out.println("第一次接收:"+s+" 接收长度:"+s.length()); String s1=sc.next(); System.out.println("第二次接收:"+s1+" 接收长度:"+s1.length()); String s2=sc.nextLine(); System.out.println("第三次接收:"+s2+" 接收长度:"+s2.length()); } }运行结果如下: 请注意,我一共只输入了一次,但是为什么会出现3次接收呢? 咱们再来分析一下代码:
第一次:next() 第二次:next() 第三次:nextLine()
并且每两串中文之间分别有1个和2个空格。
测试代码里加入长度是非常有意义的,把此次及以上信息综合起来分析,我们可以得出结论:
next()以空格或Enter为结束符,但不接收它们。在一次扫描中,当next()遇到了结束符,就会不管剩下的字符了,但这并不代表剩下的字符就没了,只是继续留在控制台,从这点我们可以看出,Scanner并不会监控键盘的输入,而是扫描控制台中的字符。nextLine()只以Enter作为结束符,并且接收它。那么为什么第三次(nextLine())接收只是接收了第二次(next())接收留下的两个空格,而没有把第一次(next())接收时留下的空格也接收了呢?那是因为:对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。当然,上边只是自己从测试代码中得出的结论,下面是菜鸟教程中更为详细的描述:
next() 与 nextLine() 区别
next(): 1、一定要读取到有效字符后才可以结束输入。 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。 next() 不能得到带有空格的字符串。
nextLine(): 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。 2、可以获得空白。
提醒一下:
对于next(),Tab (跳格键) 也是结束符(空白)
补充一下,(System.in)下nextLine()的返回值String会不会得到null的问题
Scanner sc=new Scanner(System.in); String str=sc.nextLine(); System.out.println("输出内容为:"+"\""+str+"\""+" 输出长度为:"+str.length()); String s=null; System.out.println("输出内容为:"+"\""+s+"\""+" 输出长度为:");运行结果如下:
输出内容为:"" 输出长度为:0 输出内容为:“null” 输出长度为: