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
相关产品推荐
相关产品推荐

