nextline() 读不到输入是因为 nextint() 等方法未消费换行符,导致 nextline() 立即返回空字符串;应在其后加 scanner.nextline() 清缓冲,或统一用 nextline() 配合 parsexxx() 转换。

nextLine() 为什么总读不到输入?
因为 nextInt()、nextDouble() 等方法不会消费换行符,光标停在换行符上,紧接着调用 nextLine() 就会立刻返回空字符串。
- 典型现象:
nextInt()后跟nextLine(),第二行输入直接跳过或得到空串 - 根本原因:Scanner 的 token 分割逻辑把换行符当作分隔符,但没“吃掉”它
- 最稳妥解法:在
nextInt()后加一句scanner.nextLine()手动清掉残留换行符 - 替代方案:统一用
nextLine()读所有输入,再用Integer.parseInt()转数字——更安全,尤其适合混合输入场景
读取含空格的完整一行该用哪个方法?
必须用 nextLine()。其他方法如 next() 遇到空格/制表符/换行就停,只拿第一个单词。
-
next():按空白符切分,返回下一个 token,不适合地址、姓名等含空格字段 -
nextLine():从当前位置读到换行符(不含),能拿到整行原始内容 - 注意:如果前序调用过
nextInt(),不清理缓冲区,nextLine()会立即返回空——这是新手最高频卡点 - 示例:
String address = scanner.nextLine();可读入 “No. 123, Zhongguancun St.”
Scanner 关闭后还能不能继续读?
不能。一旦调用 scanner.close(),底层关联的 System.in 流也被关闭,后续任何读取都会抛 IllegalStateException。
- 错误现象:
Exception in thread "main" java.lang.IllegalStateException: Scanner closed - 常见误操作:在循环里反复 new Scanner(System.in) 并 close() —— 每次 close 都关掉了标准输入
- 正确做法:一个程序生命周期内,只创建一个
Scanner实例,且**全程不 close()**(除非你明确要阻断所有后续输入) - 例外:若 Scanner 包装的是文件或字符串(如
new Scanner(new File("a.txt"))),则必须 close;但包装System.in时,close 是危险操作
中文输入乱码或卡住怎么办?
默认编码依赖系统,Windows 控制台常是 GBK,而 Java 默认按 UTF-8 解码,导致 Scanner 读取中文时出错或阻塞。
立即学习“Java免费学习笔记(深入)”;
- 现象:输入中文后程序无响应,或打印出来是问号、方块、异常字符
- 解决路径:显式指定编码,用
new Scanner(System.in, "UTF-8")或"GBK"(依终端环境而定) - 验证方式:先用
System.getProperty("file.encoding")查 JVM 默认编码,再对比终端chcp(Windows)或locale(macOS/Linux) - IDE 用户注意:IntelliJ/Eclipse 控制台编码设置需与 Scanner 构造参数一致,否则白配










