You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Scanner连续读取两个字符串时跳过首个输入的问题求解

Java Scanner连续读取字符串跳过输入问题排查与解决

问题根因

该问题由Java Scanner类的输入缓冲区残留换行符导致:

  • 如果你在执行本次书名、作者输入逻辑之前,调用过scan.nextInt()、scan.nextDouble()、scan.next()这类非nextLine()的输入方法,这类方法仅会读取对应类型的有效输入内容,不会消费输入末尾用户按下回车产生的换行符\n
  • 残留的换行符会一直存储在输入缓冲区中,第一次调用scan.nextLine()读取书名时,方法会直接读取到这个残留换行符,将其判定为一行空输入直接返回,因此不会触发用户输入等待,表现为直接跳过了书名输入环节

解决方案

方案1:主动消费残留换行符(推荐,适配带空格的书名/作者)

在之前执行完非nextLine()的输入操作后,额外调用一次scan.nextLine()吃掉缓冲区里的残留换行符,再执行书名、作者的输入逻辑即可正常运行,示例代码:

// 假设你之前有过读取数值的操作,比如输入图书编号
int bookId = scan.nextInt();
// 新增这一行,消费nextInt残留的换行符
scan.nextLine();

// 原有输入逻辑无需修改即可正常触发输入
String boknam;
String bokauthor;
System.out.print("Enter bookNAme: ");
boknam = scan.nextLine();
System.out.println("");
System.out.print("Enter bookAuthor: ");
bokauthor = scan.nextLine();

方案2:统一使用nextLine读取后做类型转换(从根源避免换行符残留)

如果你的场景需要频繁混合读取数值和字符串,可以统一用nextLine()读取所有输入,再手动将需要数值的内容转换为对应类型,完全避免换行符残留问题:

// 读取数值类内容时,用nextLine接收后做类型转换
int bookId = Integer.parseInt(scan.nextLine());

// 后续字符串输入不需要额外处理
String boknam;
String bokauthor;
System.out.print("Enter bookNAme: ");
boknam = scan.nextLine();
System.out.println("");
System.out.print("Enter bookAuthor: ");
bokauthor = scan.nextLine();

方案3:使用next()方法读取字符串(仅适用书名/作者不含空格的场景)

如果业务规则里书名、作者都不允许包含空格,可以把nextLine()替换为next(),next()方法会自动忽略开头的空白字符(包括残留换行符),直到读取到下一个空白字符为止,也可以解决跳过输入的问题:

System.out.print("Enter bookNAme: ");
// 注意:next()无法读取带空格的内容,例如书名是"Java 编程思想"时只会读取到"Java"
boknam = scan.next();
System.out.println("");
System.out.print("Enter bookAuthor: ");
bokauthor = scan.next();

内容的提问来源于stack exchange,提问作者Abdul raheem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:02