
java使用scanner读取int、double后,nextline()常因缓冲区残留换行符而返回空字符串;需在读取数值后调用scanner.nextline()清空缓冲区,再安全读取后续字符串。
java使用scanner读取int、double后,nextline()常因缓冲区残留换行符而返回空字符串;需在读取数值后调用scanner.nextline()清空缓冲区,再安全读取后续字符串。
在Java控制台输入处理中,Scanner 类的 nextInt() 和 nextDouble() 方法不会消费输入末尾的换行符(\n),该换行符会保留在输入缓冲区中。当后续调用 nextLine() 时,它立即读取到这个残留的换行符,并返回一个空字符串——这正是你遇到 myString 显示为空的根本原因。
问题复现与关键修复点
你的原始代码中:
userInt = scnr.nextInt(); // 读取99,但\n留在缓冲区 userDouble = scnr.nextDouble(); // 读取3.77,\n仍留在缓冲区 myChar = scnr.next().charAt(0); // next()跳过空白并读'z',但\n仍未被清除 myString = scnr.nextLine(); // ⚠️ 直接读到残留\n → 返回""
✅ 正确做法:在最后一次非nextLine()输入(如next()或nextDouble())之后、nextLine()之前,显式插入一次 scnr.nextLine() 清空缓冲区:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
// ... 读取 userInt, userDouble, myChar 后 scnr.nextLine(); // 关键!吃掉前序输入遗留的换行符 myString = scnr.nextLine(); // 现在才能正确读取 "Howdy"
完整可运行示例(推荐写法)
import java.util.Scanner;
public class BasicInput {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
System.out.print("Enter integer: ");
int userInt = scnr.nextInt();
System.out.print("Enter double: ");
double userDouble = scnr.nextDouble();
System.out.print("Enter character: ");
char myChar = scnr.next().charAt(0);
scnr.nextLine(); // ✅ 清除缓冲区残留换行符(核心修复)
System.out.print("Enter string: ");
String myString = scnr.nextLine();
// 正序输出(使用printf提升格式可控性)
System.out.printf("%d %.2f %c %s%n", userInt, userDouble, myChar, myString);
// 逆序输出
System.out.printf("%s %c %.2f %d%n", myString, myChar, userDouble, userInt);
// 类型转换输出
System.out.println(userDouble + " cast to an integer is " + (int) userDouble);
scnr.close(); // 养成关闭Scanner的习惯,避免资源泄漏
}
}注意事项与最佳实践
- ?
nextLine()是唯一能读取含空格字符串的方法(如"Hello World"),而next()遇空格即终止; - ? 所有以
nextXXX()(除nextLine()外)结尾的操作都可能遗留\n,需统一用nextLine()清理; - ? 若需严格校验字符输入(如仅接受单个字母),可用正则:
scnr.next("[a-zA-Z]").charAt(0); - ? 使用
printf替代字符串拼接,可精确控制浮点数小数位(如%.2f)、避免自动类型转换干扰; - ? 始终调用
scnr.close(),尤其在生产环境中防止Scanner持有System.in导致资源占用。
掌握这一缓冲区机制,不仅能解决字符串为空的问题,更能从根本上规避各类 Scanner 输入错乱场景——它是 Java 控制台 I/O 的关键底层逻辑。
立即学习“Java免费学习笔记(深入)”;

















