为何连续调用Scanner的hasNext()仅能输入一次,添加next()后可输入两次?
为什么添加
sc.next()后需要两次输入? 嘿,这个问题的核心在于Scanner类的缓冲区读取逻辑,我给你一步步掰明白:
首先得搞清楚两个方法的本质区别:
sc.hasNext():只是检查Scanner的输入缓冲区里有没有可读取的内容,它不会把内容从缓冲区里拿走——就像你看一眼冰箱里有没有饮料,看完饮料还在冰箱里。sc.next():会读取并消费缓冲区里的内容——相当于你把冰箱里的饮料拿出来喝掉,冰箱里就没这个饮料了。
第一种代码场景(没有sc.next())
执行流程是这样的:
- 你输入
1,这个值被存入Scanner的输入缓冲区; - 第一次调用
sc.hasNext():检测到缓冲区里有1,返回true,但1还留在缓冲区里; - 第二次调用
sc.hasNext():再次检测缓冲区,1还在那儿,所以还是返回true——根本不需要再输入,因为缓冲区里的内容没被拿走。
第二种代码场景(添加了sc.next())
执行流程就变了:
- 你输入
1,存入缓冲区; - 第一次
sc.hasNext():检测到有内容,返回true,1仍在缓冲区; - 调用
sc.next():把缓冲区里的1读取出来,输出str -> 1,这时候缓冲区被清空了; - 第二次调用
sc.hasNext():发现缓冲区空了,Scanner就会暂停程序,等待你再次输入内容——所以你得再输一次1,新的1进入缓冲区后,hasNext()才会返回true。
简单总结:hasNext()只“看”不“拿”,next()既“拿”又“消”,这就是为什么加了next()之后需要两次输入的原因~
内容的提问来源于stack exchange,提问作者Garmin
相关产品推荐
相关产品推荐

