当使用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() 清空缓冲区中的残留换行符,再进行真正的字符串读取:
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);
}
}⚠️ 注意事项:

总结:Scanner 的混合输入必须注意缓冲区状态。牢记——nextXXX() 不吞换行符,nextLine() 专吃换行符。一次主动清理,即可确保后续字符串输入准确无误。