Java Scanner输入顺序问题:为何调换输入顺序后代码才生效?
为什么调换Scanner输入语句顺序会导致代码运行差异?
嘿,我来帮你彻底搞明白这个问题!核心原因在于Java Scanner类不同读取方法对换行符的处理逻辑不一样,咱们一步步拆解:
第一段代码失效的原因
先看这段代码的执行流程:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner (System.in); int i=s.nextInt(); double d=s.nextDouble(); String str=s.nextLine(); System.out.println("String :"+str); System.out.println("Double : "+d); System.out.println("int : "+i); } }
当你运行这段代码并输入内容时(比如输入10→回车→3.14→回车→Hello→回车):
nextInt()只读取整数10,但会把你输入的换行符(\n)留在输入缓冲区nextDouble()接着读取小数3.14,同样把后面的换行符留在缓冲区- 轮到
nextLine()时,它会从当前缓冲区位置开始读取,直到遇到换行符。这时候缓冲区里正好残留着上一步的换行符,所以nextLine()直接读取了一个空字符串,你输入的Hello根本没被读到!
这就是为啥你看不到自己输入的字符串,感觉代码“失效”了。
第二段代码生效的原因
再看调整顺序后的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner (System.in); String str=s.nextLine(); int i=s.nextInt(); double d=s.nextDouble(); System.out.println("String :"+str); System.out.println("Double : "+d); System.out.println("int : "+i); } }
这里的关键是先调用nextLine():
nextLine()会读取你输入的整行内容(比如Hello),并且会把末尾的换行符一起从缓冲区中清除掉- 之后的
nextInt()和nextDouble()就可以正常读取后续的数值,因为缓冲区里没有残留的换行符干扰,它们会跳过前面的空白(包括换行)去读取对应的数值
这样每一步的输入都能被正确捕获,代码自然就正常运行了。
给第一段代码的修复方案
如果你想保留第一段代码的输入顺序,只需要在nextDouble()之后加一行代码,手动吃掉残留的换行符:
int i=s.nextInt(); double d=s.nextDouble(); s.nextLine(); // 清除缓冲区里的换行符 String str=s.nextLine();
这样后面的nextLine()就能正常读取你输入的字符串了。
内容的提问来源于stack exchange,提问作者Mohit Parekh
相关产品推荐
相关产品推荐

