跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

在Java中如何使用Scanner读取输入_Java控制台输入解析

nextLine() 经常读不到输入是因为 nextInt() 等方法不消费换行符,导致 nextLine() 立即读取残留的 \n 而返回空字符串;修复是在 nextInt() 后加 scanner.nextLine() 清缓冲区。 Java 中
Scanner
是最常用的控制台输入工具,但它容易因调用顺序或类型不匹配导致阻塞、跳过输入或抛出
InputMismatchException
—— 问题往往不出在“会不会用”,而在于“什么时候清缓冲区”和“哪种方法读哪类数据”。 为什么
nextLine()
经常读不到输入? 这是最典型的陷阱:在
nextInt()
、
nextDouble()
等方法后直接调用
nextLine()
,后者会立刻返回空字符串。 原因:
nextInt()
只读数字,不消费其后的换行符(
\n
),而
nextLine()
会读取从当前位置到下一个换行符之间的所有内容 —— 此时它刚好碰到残留的
\n
,于是返回空串。 修复方式:在
nextInt()
后加一句
scanner.nextLine();
手动吃掉换行符 替代方案:统一用
nextLine()
读入,再用
Integer.parseInt()
或
Double.parseDouble()
转换 注意:
hasNextLine()
不会阻塞,但
nextLine()
会等待用户敲回车
next()
和
nextLine()
的行为差异 二者都读字符串,但分界逻辑完全不同: 立即学习 “ Java免费学习笔记(深入) ”; Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载
next()
:以空白符(空格、tab、换行)为分隔,只返回下一个“单词”,且自动跳过开头所有空白符
nextLine()
:以换行符为结束,返回整行(不含
\n
),包括中间的空格 如果用户输入
"hello world"
,
next()
返回
"hello"
,再调一次才得
"world"
;
nextLine()
一次就返回完整字符串 当需要读含空格的姓名、地址等字段时,必须用
nextLine()
如何安全读取不确定类型的用户输入? 不要依赖
hasNextInt()
+
nextInt()
连用去“试探”,因为失败时输入未被消费,下次调用仍会卡在同一位置。 推荐做法:一律先用
nextLine()
读整行,再用
String.trim().isEmpty()
判断是否为空,再用正则或
parseInt()
尝试解析 示例:
String line = scanner.nextLine().trim(); if (!line.isEmpty()) { try { int value = Integer.parseInt(line); // 处理整数 } catch (NumberFormatException e) { // 处理非数字输入 } }
避免在循环中反复调用
hasNextXxx()
而不推进读取位置,否则可能无限循环 Scanner 关闭后还能不能继续用? 不能。
scanner.close()
会关闭底层的
System.in
流 —— 后续任何对
System.in
的读取(包括新建另一个
Scanner
)都会抛
IllegalStateException
或直接阻塞无响应。 除非明确不再需要任何输入,否则不要轻易
close()
在 main 方法末尾关闭通常没问题;但在工具方法中返回前就 close,是常见误操作 若需多次输入又担心资源泄漏,可将
Scanner
作为类成员长期持有(注意线程安全),或改用
BufferedReader
配合
InputStreamReader(System.in)
真正难的不是记住每个方法名,而是理解它们背后对输入流指针的移动逻辑 —— 多数 bug 都源于假设“读完了”其实只是“读了一半”。

相关文章