为何我的Java代码中nextLine()会跳过第一个字符串输入?
为什么
nextLine()会跳过第一个字符串输入? 这个问题其实是Java Scanner类的经典“小陷阱”,很多刚入门的开发者都会踩坑,核心原因是不同输入方法对换行符的处理逻辑不一样:
1. nextInt()/nextFloat()的行为
当你用nextInt()和nextFloat()读取数值时,这些方法只会读取输入中的有效数字部分,不会处理输入末尾的换行符。比如你输入完第二个浮点数后按下回车,这个换行符(\n)会留在输入流里,并没有被消耗掉。
2. nextLine()的行为
nextLine()的作用是读取从当前输入流位置开始,直到遇到换行符为止的所有字符(包括换行符之前的空内容),然后消耗掉这个换行符。所以当你在读取完浮点数后第一次调用nextLine()时,它会直接读取到那个残留的换行符,得到一个空字符串,看起来就像是“跳过了第一个输入”——实际上它已经读取了内容,只是内容是空的而已。
3. 为什么next()能正常工作?
next()的逻辑是:先自动跳过输入开头的所有空白字符(包括换行符、空格、制表符),然后读取到下一个空白字符为止的内容。所以即使输入流里残留了换行符,next()会先跳过它,然后读取你输入的第一个单词,再读取第二个,自然就正常了。
解决方法
如果你想继续用nextLine()来读取字符串,只需要在读取完最后一个数值后,额外调用一次nextLine()来消耗掉残留的换行符就行:
public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("Enter two numbers: "); int a = sc.nextInt(); int b = sc.nextInt(); System.out.println("Enter two decimal numbers: "); float x = sc.nextFloat(); float y = sc.nextFloat(); // 新增这一行,消耗掉浮点数输入后的换行符 sc.nextLine(); System.out.println("Enter two words: "); String i = sc.nextLine(); String j = sc.nextLine(); System.out.println(max(a,b)); System.out.println(max(x,y)); System.out.println(max(i,j)); }
这样后面的nextLine()就能正常等待你输入字符串啦~
内容的提问来源于stack exchange,提问作者Ahmed Mahmoud
相关产品推荐
相关产品推荐

