scanner.next()会“被空格截断”是因为它以空白字符为分隔符,只读取下一个完整token;应改用nextline()读取整行,但需注意nextint()等方法遗留换行符导致nextline()返回空字符串的问题。

Java 中 Scanner.next() 默认以空白字符(空格、制表符、换行符)为分隔符,因此遇到第一个空格就会停止读取,导致“被空格截断”。要完整读取含空格的字符串(如用户姓名、地址、一句话),应改用 Scanner.nextLine(),但需注意它与 next() 混用时的缓冲区残留问题。
为什么 next() 会“意外截断”
next() 只读取下一个**完整标记(token)**,即从当前位置跳过前导空白后,读到下一个空白前为止。例如输入 "Hello World",next() 返回 "Hello",而 "World" 仍留在缓冲区中——这不是 bug,而是其设计意图(类似词法分析)。
正确读取整行含空格字符串:用 nextLine()
直接调用 nextLine() 可读取当前行剩余全部字符(包括中间空格),直到换行符为止。关键点:
- 它会消费掉换行符,不会残留
- 若之前调用了
next()、nextInt()等方法,它们不消费换行符,会导致紧接着的nextLine()立即返回空字符串
避免缓冲区干扰的典型写法
当混合读取数值和字符串时,务必在数值读取后手动“清空”换行符:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Scanner sc = new Scanner(System.in);
System.out.print("年龄: ");
int age = sc.nextInt(); // 不消费 '
'
sc.nextLine(); // 消费掉上一行遗留的换行符
System.out.print("姓名: ");
String name = sc.nextLine(); // 现在能正确读取含空格的姓名
或者统一使用 nextLine() 并手动解析数值:
System.out.print("年龄: ");
int age = Integer.parseInt(sc.nextLine().trim());
System.out.print("姓名: ");
String name = sc.nextLine();
需要按空格分割但仍保留原始输入?用 nextLine() + split()
如果目标是获取完整输入后再按空格切分(比如命令行参数解析),不要依赖 next() 循环,而是先读整行,再处理:
System.out.print("请输入多个单词: ");
String line = sc.nextLine(); // 读入 "apple banana cherry"
String[] words = line.split("\s+"); // 按一个或多个空白分割
这样既避免截断,又保留了对空格语义的完全控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










