
当使用nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个方法遗留的换行符而直接返回空字符串,导致输入被“跳过”;正确做法是在读取基本类型后手动调用一次nextline()清空缓冲区。
在Java中,Scanner类的nextLine()方法以换行符(\n)为终止符,读取从当前光标位置到下一个换行符之间的所有字符(不包括换行符本身)。而nextInt()、nextDouble()等nextXxx()方法仅读取匹配的数值,不会消费其后的换行符——该换行符仍滞留在输入缓冲区中。
因此,当执行以下代码时:
int i = scan.nextInt(); // 用户输入 "42" + 回车 → 缓冲区剩余: "\n" double d = scan.nextDouble(); // 用户输入 "3.14" + 回车 → 缓冲区剩余: "\n" String s = scan.nextLine(); // 立即读到 "\n",返回空字符串 "",光标已越过该换行符
nextLine() 实际读取的是上一次输入操作残留的换行符,而非用户期望的新一行字符串,造成“跳过输入”的错觉。
✅ 正确修复方式:在每次调用 nextXXX() 后,显式调用一次 scan.nextLine() 清空缓冲区中的残留换行符,再进行真正的字符串读取:
通过使用BizPower CRM解决方案,您的员工、生产过程及信息能够与客户保持着平稳、无间断的联络,并且能够通过以客户为焦点、创新的产品和服务;以客户为中心,更高层次的生产过程;持久有益的客户关系这三个方面创造有价值客户的领导关系。选择Bizpower CRM的原因1、灵活的数据权限和功能权限BizPower CRM 系统通过引入了灵活的数据权限和功能权限,模仿现实中协同工作的实际情况。 实现企
立即学习“Java免费学习笔记(深入)”;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter an integer: ");
int i = scan.nextInt();
scan.nextLine(); // ✅ 消耗掉nextInt()留下的换行符
System.out.print("Enter a double: ");
double d = scan.nextDouble();
scan.nextLine(); // ✅ 消耗掉nextDouble()留下的换行符
System.out.print("Enter a string: ");
String s = scan.nextLine(); // ✅ 现在能正确读取用户输入的整行字符串
scan.close();
System.out.println("\nString: \"" + s + "\"");
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}⚠️ 注意事项:
- 不要依赖 scan.skip("\\R") 或正则跳过——它不可靠且易出错;
- 若需读取带空格的字符串(如 "Hello World"),nextLine() 是唯一正确选择;next() 会因空格截断;
- 在循环中重复读取时,务必为每个 nextXXX() 配套 nextLine() 清理(除非后续仍用 nextXXX());
- 更健壮的替代方案是统一使用 nextLine() + 字符串解析(如 Integer.parseInt(scan.nextLine())),可完全规避缓冲区干扰。
总结:Scanner 的混合输入必须注意缓冲区状态。牢记——nextXXX() 不吞换行符,nextLine() 专吃换行符。一次主动清理,即可确保后续字符串输入准确无误。









