You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:18:26