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