使用Scanner的nextLine()为数组赋值时跳过首个元素的问题
解决Scanner中nextInt()后nextLine()跳过第一个输入的问题
嘿,这个坑我刚学Java的时候也踩过!咱们来一步步捋清楚问题出在哪,再给你两个靠谱的解决办法。
问题根源
当你用keybo.nextInt()读取用户输入的数字(比如示例里的3)时,这个方法只会读取数字部分,而用户按下的**回车键对应的换行符(\n)**会留在输入缓冲区里。接下来第一次调用nextLine()时,它会直接读取这个残留的换行符,相当于读了一个空字符串,所以就出现了“跳过第一个元素”的假象——其实它读了个空行而已。
解决方案一:用额外的nextLine()吃掉换行符
在nextInt()之后,专门加一行keybo.nextLine()来消耗掉缓冲区里的换行符,这样后续的nextLine()就能正常读取用户输入的内容了:
System.out.print("How many extras?: "); int extras = keybo.nextInt(); // 关键:吃掉nextInt()留下的换行符 keybo.nextLine(); String[] extraArray = new String[extras]; for (int i = 1; i<=extras; i++) { System.out.println("Enter extra " + i + ": "); extraArray[i-1] = keybo.nextLine(); } sandwich1.setExtras(extraArray);
解决方案二:用nextLine()读取数字再转成整数
另一种更彻底的方式是全程用nextLine()读取输入,把读取到的字符串转成整数,这样就不会有残留换行符的问题了:
System.out.print("How many extras?: "); // 先读取整行输入,再转换为整数 int extras = Integer.parseInt(keybo.nextLine()); String[] extraArray = new String[extras]; for (int i = 1; i<=extras; i++) { System.out.println("Enter extra " + i + ": "); extraArray[i-1] = keybo.nextLine(); } sandwich1.setExtras(extraArray);
小补充
如果你的“extra”内容里不会包含空格,用keybo.next()代替nextLine()也能临时解决问题,但nextLine()的优势是可以读取包含空格的整行内容,更适合需要完整输入的场景。
内容的提问来源于stack exchange,提问作者DrSooch
相关产品推荐
相关产品推荐

