Java使用Scanner类时最后一个输入问询未触发是什么原因
问题原因说明
你遇到的是Java Scanner 类的经典输入缓冲区残留换行符问题,具体逻辑如下:
nextInt()方法仅会读取输入的整数内容,不会处理用户输入完数字后按下回车键产生的 换行符(\n),该换行符会直接残留在输入缓冲区中。nextLine()方法的读取规则是读取从当前光标位置到下一个换行符之间的全部内容,遇到换行符就结束读取,同时自动消耗该换行符。- 当代码运行到最后一个
yEs = input.nextLine();时,方法会直接读取到缓冲区中残留的换行符,返回空字符串,自然不会等待用户手动输入内容。
修复方案
下面提供两种常用的修复方式,按需选择即可:
方案1:手动消耗残留换行符
在 nextInt() 调用后额外加一次 nextLine() 调用,主动把残留的换行符吃掉,修改后完整代码如下:
import java.util.Scanner; public class GamingJava { public static void main(String[] args) { Scanner input = new Scanner(System.in); String Name; int password; String yEs; System.out.print("hello sir what is your name? "); Name = input.nextLine(); System.out.print("what is your password? "); password = input.nextInt(); input.nextLine(); // 新增此行,消耗nextInt残留的换行符 System.out.println("your name was "+Name+" and your password was "+password); System.out.print("are you sure? "); yEs = input.nextLine(); System.out.println(yEs); } }
方案2:统一使用nextLine读取后做类型转换
所有输入都统一用 nextLine() 读取,再手动转换为对应的数据类型,从根源上避免残留换行符的问题,密码读取部分修改后代码如下:
System.out.print("what is your password? "); // 先读取整行内容,再转为int类型 password = Integer.parseInt(input.nextLine());
内容的提问来源于stack exchange,提问作者Anto gamus
相关产品推荐
相关产品推荐

