Java中hasNext()函数使用疑问:为何两次调用结果不同?
关于Scanner的token概念与hasNext()的作用解析
嘿,我来帮你把这个问题掰扯清楚~
先搞懂什么是Token(令牌)
Scanner里的token其实就是被分隔符拆分后的独立小元素,默认的分隔符是空白字符(空格、换行、制表符这些)。比如你代码里的字符串 "Hello World! 3 + 3.0 = 6",被拆分后token就是:Hello、World!、3、+、3.0、=、6 这些单独的单元。你可以把它理解成Scanner“啃”字符串时,一口一口咬下来的小片段。
hasNext()的核心作用
hasNext() 就是个“探测器”——用来检查Scanner当前的输入流里是否还有下一个token可以读取,它不会移动Scanner的读取指针,只是做个存在性检查:如果有未读取的token,返回true;输入流已经空了,就返回false。
一步步拆解你的代码执行流程
现在来看你贴的这段代码,跟着执行顺序走,就能明白为什么两次hasNext()结果会变化:
package com.tutorialspoint; import java.util.*; import java.util.regex.Pattern; public class ScannerDemo { public static void main(String[] args) { String s = "Hello World! 3 + 3.0 = 6"; // 创建Scanner,把目标字符串作为输入源 Scanner scanner = new Scanner(s); // 第一次调用hasNext():此时输入流里还有一堆token没读,探测器返回true System.out.println("" + scanner.hasNext()); // 关键来了:调用nextLine()!这个方法会一次性读取从当前指针位置到换行符的所有内容 // 你的输入字符串里没有换行符,所以它直接把整个剩余的字符串都读完了,Scanner的指针直接跳到了输入流的末尾 System.out.println("" + scanner.nextLine()); // 第二次调用hasNext():输入流已经被nextLine()彻底读空了,没有任何token剩下,探测器返回false System.out.println("" + scanner.hasNext()); // 关闭Scanner scanner.close(); } }
这里的核心坑点是**nextLine()和hasNext()的工作逻辑差异**:
hasNext()只做探测,不消耗输入内容;nextLine()是“大口吞”,直接把当前位置到换行的所有内容全读完,不管中间有多少token,读完后输入流就空了。
补充小测试验证
如果你把代码里的nextLine()换成next()(每次只读一个token),你会发现第一次hasNext()返回true,调用next()后再调用hasNext()还是true,直到把所有token都读完,最后一次hasNext()才会返回false,这样能更直观地理解token和hasNext()的关系。
内容的提问来源于stack exchange,提问作者Nguyen Dung
相关产品推荐
相关产品推荐

