nextLine() 总读到空字符串是因为 nextInt() 等方法不消费换行符,残留的 被 nextLine() 立即读取;应在 nextInt() 后加 scanner.nextLine() 清除缓冲区。

nextLine() 为什么总读到空字符串
因为 nextInt()、nextDouble() 这类方法只读数字,不消费换行符,回车还卡在缓冲区里。下次调用 nextLine() 就立刻拿到那个残留的
,返回空串。
- 典型场景:先用
nextInt()读年龄,再用nextLine()读姓名,结果姓名直接为空 - 最简解法:在
nextInt()后加一句scanner.nextLine();手动清掉换行符 - 别用
skip("\R")或正则跳过——不同平台换行符不同(、),nextLine()才是跨平台安全的“吃掉一行”的操作
用 next() 和 nextLine() 混搭时缓冲区怎么变
next() 停在第一个空白符(空格/制表/换行),但不吞它;nextLine() 则从当前位置一直读到换行,并吞掉换行符。两者行为不对称,混用极易出错。
- 常见错误现象:
next()读完用户名后,紧接着nextLine()读地址,地址却为空 - 真实缓冲区状态示例:
"alice<space>beijing "</space>→next()返回"alice",缓冲区剩下" beijing "→nextLine()立刻返回" beijing"(注意开头空格) - 建议统一用
nextLine()读所有输入,再用Integer.parseInt()等转换数值,避免缓冲区错位
Scanner 关闭后还能不能重用
不能。close() 不仅关闭底层 System.in,还会锁死整个 Scanner 实例——再调任何 nextXxx() 方法都会抛 IllegalStateException。
- 错误写法:
scanner.close(); scanner.nextInt();→ 报错Scanner closed - 如果需要多次输入又不想重复 new Scanner(System.in),就别关;System.in 是进程级资源,JVM 退出时自动释放
- 只有在包装了文件或网络流(如
new Scanner(new FileInputStream("a.txt")))时才必须 close,防止句柄泄漏
输入中文时乱码或卡住怎么办
默认编码依赖系统环境,Windows 控制台通常是 GBK,而 Scanner 默认用平台编码读 System.in。如果终端实际发的是 UTF-8 字节,Scanner 就会解错。
立即学习“Java免费学习笔记(深入)”;
- 现象:输“你好”变成 “浣犲ソ” 或读取阻塞
- 解决方式:显式指定编码,
new Scanner(System.in, "UTF-8")(确保终端也是 UTF-8 模式) - IDE 内置终端常不一致:IntelliJ 默认 UTF-8,Eclipse 控制台可能需手动设编码;命令行运行前用
chcp 65001(Windows)或export LANG=en_US.UTF-8(Linux/macOS)对齐
input() 全行读取的直觉完全不同,得主动适应。










