
当使用scanner的nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个输入操作遗留的换行符,导致返回空字符串而非用户预期的整行文本。
当使用scanner的nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个输入操作遗留的换行符,导致返回空字符串而非用户预期的整行文本。
在Java中,Scanner类的nextInt()、nextDouble()等方法不会消费输入末尾的换行符(
),而nextLine()的作用是“读取从当前位置到下一个换行符之间的所有字符”。因此,当连续调用 scan.nextInt() → scan.nextDouble() → scan.nextLine() 时,最后一个 nextLine() 实际读取的是 nextDouble() 留下的换行符——结果就是得到一个空字符串(""),而非用户后续键入的完整句子。
例如,按如下顺序输入:
26↵ 35.64↵ my name is Alice↵
-
nextInt()读取26,光标停在第一个↵前; -
nextDouble()读取35.64,光标停在第二个↵前; -
nextLine()立即读取第二个↵之后到第三个↵之间的内容——但此时缓冲区中紧接的就是第二个↵,所以它“立刻”返回空行(即""),根本没等待用户输入!
✅ 正确做法:在调用 nextLine() 前,插入一次“吸掉”残留换行符的 nextLine()(俗称“吃掉回车”):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
double d = scan.nextDouble();
scan.nextLine(); // ? 关键修复:消费掉 nextDouble() 后残留的换行符
String s = scan.nextLine(); // ✅ 现在能正确读取整行
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}
⚠️ 注意事项:
- 不要使用
scan.skip("\R")或scan.skip(" ")替代——它们不可靠,因平台换行符可能为(Windows)或(Unix/macOS); - 更健壮的替代方案是统一用
nextLine()解析所有输入,再手动转换类型(如Integer.parseInt(scan.nextLine())),可彻底规避此问题; - 若需读取不含空格的单个词,可用
next();但next()遇空格即停止,不适用于句子。
? 总结:nextLine() 的行为本质是“行导向”,而 nextInt()/nextDouble() 是“令牌导向”,二者混合使用时必须显式处理换行符边界。这是Java Scanner最经典也最容易被忽视的陷阱之一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










