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

Java中Scanner的nextLine()在输入double类型后无法正常工作的问题

问题:Scanner读取字符串时跳过输入的问题

嘿,这个问题我之前也碰到过!是Scanner的输入读取机制在搞鬼,咱们一步步来解决:

首先先贴出你的代码:

import java.util.Scanner; 
public class test2 { 
    public static void main(String[] args) { 
        Scanner scan = new Scanner(System.in); 
        System.out.println(""); 
        int i = scan.nextInt(); 
        double d=scan.nextDouble(); 
        String s=scan.nextLine(); 
        System.out.println("String: " + s); 
        System.out.println("Double: " + d); 
        System.out.println("Int: " + i); 
    } 
}

你的预期与实际情况

你预期的输入是:

23
23
mks

预期输出应该是:

String: mks
Double:23.0
Int:23

但实际运行时,输入完第二个23并回车后,程序直接输出结果,根本没等你输入字符串,实际输出是:

String:
Double:23.0
Int:23


问题根源

问题出在nextInt()和nextDouble()的读取逻辑上:它们只会读取输入中的数值部分,完全不会处理数值后面的换行符。

举个例子,当你输入23并按回车时,输入流里实际是"23\n",nextDouble()读取了23,但剩下的"\n"还留在输入流里。接下来调用nextLine()时,它会从当前位置开始读取,直到遇到换行符——结果直接把这个空的换行符读成了空字符串,自然就跳过了你要输入的mks。


解决方案

这里给你三种可行的解决办法,按需选择:

方案1:吃掉残留的换行符(最常用)

在读取完double之后,额外调用一次scan.nextLine(),把输入流里残留的换行符消耗掉,这样后续的nextLine()就能正确读取用户输入的字符串了:

import java.util.Scanner; 
public class test2 { 
    public static void main(String[] args) { 
        Scanner scan = new Scanner(System.in); 
        System.out.println(""); 
        int i = scan.nextInt(); 
        double d=scan.nextDouble(); 
        // 新增:吃掉残留的换行符
        scan.nextLine(); 
        String s=scan.nextLine(); 
        System.out.println("String: " + s); 
        System.out.println("Double: " + d); 
        System.out.println("Int: " + i); 
    } 
}

方案2:用next()读取字符串(适合无空格的场景)

如果你的字符串不包含空格(比如示例中的mks),可以直接用scan.next()代替scan.nextLine()。因为next()会自动跳过前面的空白字符(包括换行符),直到遇到下一个空白字符为止,刚好能读取到目标字符串:

// 替换原有的String读取行
String s=scan.next();

⚠️ 注意:如果输入的字符串包含空格(比如hello world),next()只会读到hello,剩下的world会留在输入流里,这种情况就不适合用这个方案了。

方案3:统一用nextLine()读取再转换类型(最稳妥)

所有输入都用nextLine()读取,再手动把字符串转换成int和double类型,彻底避免换行符残留的问题:

import java.util.Scanner; 
public class test2 { 
    public static void main(String[] args) { 
        Scanner scan = new Scanner(System.in); 
        System.out.println(""); 
        // 读取int字符串并转换
        int i = Integer.parseInt(scan.nextLine()); 
        // 读取double字符串并转换
        double d=Double.parseDouble(scan.nextLine()); 
        String s=scan.nextLine(); 
        System.out.println("String: " + s); 
        System.out.println("Double: " + d); 
        System.out.println("Int: " + i); 
    } 
}

这种方法适合所有场景,不管输入有没有空格都能处理,不过要记得处理可能的类型转换异常(比如用户输入非数字的情况)。

内容的提问来源于stack exchange,提问作者Mohit Kumar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:55:01