while循环配合scanner.hasnext()持续等待用户输入,直到输入流结束或触发终止条件;常用hasnextint()+nextint()安全读取整数,或hasnextline()+nextline()逐行处理,避免混用导致的换行符残留问题。

用 while 循环配合 Scanner.hasNext(),本质是让程序持续等待用户输入,直到输入流结束(如 Ctrl+D 或 Ctrl+Z)或显式终止条件触发。它适用于命令行下“边输边处理”的场景,比如读取一串整数、单词,或解析多行日志。
核心逻辑:hasNext() 判断是否有下一个有效 token
Scanner.hasNext() 检查输入流中是否还有未读取的、符合默认分隔符(通常是空白字符)的下一个 token,它不会阻塞,也不消耗输入;只有调用 next()、nextInt() 等方法时才真正读取并移进指针。因此常用组合是:先用 hasNextXxx() 判断类型,再用 nextXxx() 安全读取。
- 若只用
hasNext(),它对任意非空 token 都返回 true(包括 "0"、"false"、空格后的内容),但无法保证后续能成功转成 int/double 等 - 推荐优先使用带类型检查的方法,例如
hasNextInt()+nextInt(),避免输入异常 - 注意:默认 Scanner 绑定的是
System.in,终端输入需按 Enter 提交一行,但hasNextXxx()会跨行扫描,不严格按“行”分割
常见用法示例:读取未知个数的整数
下面代码持续读取整数,直到用户输入非数字内容(如字母或直接结束输入):
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int num = sc.nextInt();
System.out.println("读到:" + num);
}
System.out.println("输入结束或遇到非整数");
sc.close();
运行时输入 12 34 56 abc,会输出前三数,遇到 abc 时 hasNextInt() 返回 false,循环退出——abc 仍留在缓冲区,未被消费。
监听多行文本(含空行、混合类型)
如果需要逐行处理(比如配置项、用户指令),更适合用 hasNextLine() + nextLine():
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String line = sc.nextLine().trim();
if (line.isEmpty()) continue; // 跳过空行
if ("quit".equalsIgnoreCase(line)) break; // 自定义退出指令
System.out.println("处理:" + line);
}
System.out.println("监听已停止");
sc.close();
这种方式更可控:每调用一次 nextLine() 就消耗一整行,不会跨行误判;也方便做字符串匹配、分割或正则校验。
注意事项与避坑点
-
hasNext()在控制台中不会因“暂时没输”而返回 false——只要输入流没关闭,它就一直等待;真正的退出依赖用户发送 EOF(Linux/macOS 是 Ctrl+D,Windows 是 Ctrl+Z) - 混用
nextXxx()和nextLine()易出错:例如先调nextInt(),再调nextLine(),后者会立刻读到换行符残留。解决办法是在nextInt()后加一句sc.nextLine()清掉回车 - 若需从文件读取,构造 Scanner 时传入
new File("xxx.txt"),此时hasNext()到文件末尾自然返回 false,无需人工干预










