Java Scanner相关问题:第6行代码为何与第8行执行效果一致?
核心原因解释
要搞清楚这个问题,得先明确Java Scanner两个核心方法的行为规则:
hasNext()只做输入存在性判断,不会消费输入内容,也不会移动Scanner的读取指针:如果输入缓冲区为空,它会阻塞等待用户输入;如果有未读取的内容就返回true,直到输入流结束才返回false。next()是实际的读取方法:默认以空白字符(空格、换行、制表符等)作为分隔符,读取当前指针位置的第一个输入项,读完后自动把指针移动到下一个输入项的起始位置,返回读取到的内容。
两行代码执行效果一致的原因
你提到的第6行和第8行,本质都是调用同一个Scanner实例的next()方法,只要调用时Scanner的读取指针指向同一个输入项,返回的内容、执行效果就完全相同。next()的行为只和当前指针位置有关,和它写在循环外、循环条件里还是循环体内没有关系。
while循环执行起始位置的区别
while循环的执行顺序是固定的:先判断条件返回值,符合条件才会执行循环体内容,二者是有明确区别的:
- 如果
next()写在循环条件判断之前,代码执行到这一行就一定会触发一次读取操作,不管当前有没有可用输入。 - 如果
next()写在循环体内,只有hasNext()返回true、确认有可用输入的时候才会执行,不会出现无内容强行读取的问题。
内容的提问来源于stack exchange,提问作者zhangkk
相关产品推荐
相关产品推荐

