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

Java新手求助:这段使用Scanner读取字符串的代码存在什么问题?

你的Java代码中字符串读取的问题解析

嘿,作为Java新手能写出这样的代码已经很不错啦!咱们来聊聊这段代码里字符串读取部分的问题:

核心问题:scan.next()的局限性

scan.next() 方法的工作逻辑是读取到第一个空白字符(空格、换行、制表符等)就停止。举个例子:
如果你的输入是:

10 Hello World 3.14

那程序执行后:

  • i 会拿到 10
  • s 只会拿到 "Hello",而后面的 "World" 会留在输入缓冲区里
  • 接下来读取 d 的时候,程序会尝试把 "World" 转换成double类型,直接抛出 InputMismatchException 异常,程序崩溃

这就是最大的问题:它没法处理包含空格的字符串输入,而且会破坏后续的读取流程。

解决办法:用scan.nextLine()读取整行字符串

如果想要读取用户输入的完整一行字符串(包含空格),应该使用 scan.nextLine() 方法,但这里有个小坑需要注意:
前面的 scan.nextInt() 和 scan.nextDouble() 读取完数值后,会把输入末尾的换行符留在输入流中,直接调用 scan.nextLine() 会读取到这个空的换行符,导致拿到的字符串为空。所以需要先调用一次 scan.nextLine() 来消耗掉这个换行符。

修正后的代码如下:

import java.util.Scanner;
public class Solution {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        // 消耗掉nextInt()留下的换行符,避免影响后续的nextLine()
        scan.nextLine();
        String s = scan.nextLine();
        double d = scan.nextDouble();
        
        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

当然,如果你的业务场景能确保输入的字符串绝对不会包含空格,那 scan.next() 是可以正常工作的,但实际开发中用户输入往往不可控,所以用 nextLine() 处理整行输入会更稳妥。

内容的提问来源于stack exchange,提问作者AMOXE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:41:21