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

Java中使用Scanner获取含空格字符串及字符串列表的问题求助

解决Scanner获取字符串后无法正确读取多单词列表的问题

你碰到的这个问题其实是Scanner.next()和Scanner.nextLine()的行为差异在搞鬼,我给你拆解清楚并提供几种实用的解决方案:

问题根源

  • next()方法只会读取到**第一个空白字符(空格、换行、制表符都行)**就停,而且不会消耗掉后面的换行符,会把它留在输入缓冲区里。
  • nextLine()则是读取从当前位置到换行符的所有内容,同时会把这个换行符消耗掉。

所以当你用next()读完第一个名字后,缓冲区里还留着你输完名字按回车的那个换行符,这时候直接调用nextLine(),它会先把这个空的换行内容读走,根本不会去读你后面输入的名字列表,这就是为啥你拿不到正确内容的原因。


方案1:读取整行多单词作为列表元素

如果你需要把输入的一整行多单词内容(比如"Alice Bob Charlie")拆成单个名字存入列表,可以这么做:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.println("Enter a name:");
        String name = input.next();
        
        // 关键步骤:把next()留下的换行符清掉
        input.nextLine();
        
        System.out.println("Enter a name list (multiple words allowed):");
        String nameListLine = input.nextLine();
        
        // 把整行按任意空白字符拆分(多个空格也能正确识别)
        ArrayList<String> nameList = new ArrayList<>();
        for (String nameItem : nameListLine.split("\\s+")) {
            nameList.add(nameItem);
        }
        
        // 测试输出
        System.out.println("Single name: " + name);
        System.out.println("Name list items:");
        for (String item : nameList) {
            System.out.println("- " + item);
        }
        
        input.close();
    }
}

方案2:读取多行输入作为列表

如果你的需求是每行输入一个名字,直到输入特定结束符(比如输入exit停止),同样要先处理掉残留的换行符:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.println("Enter a name:");
        String name = input.next();
        input.nextLine(); // 清空换行符
        
        System.out.println("Enter name list (enter 'exit' to stop):");
        ArrayList<String> nameList = new ArrayList<>();
        
        while (true) {
            String line = input.nextLine();
            if (line.equalsIgnoreCase("exit")) {
                break;
            }
            // 如果每行允许输入多个单词,也可以拆分后加入列表
            // nameList.addAll(Arrays.asList(line.split("\\s+")));
            nameList.add(line);
        }
        
        // 测试输出
        System.out.println("Single name: " + name);
        System.out.println("Name list:");
        for (String item : nameList) {
            System.out.println("- " + item);
        }
        
        input.close();
    }
}

额外小技巧:全程用nextLine()避免麻烦

如果第一个名字也允许带空格(比如"Mary Ann"),其实更简单的方式是全程用nextLine()读取,这样就不会有缓冲区残留的问题了:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.println("Enter a name (can have spaces):");
        String name = input.nextLine();
        
        System.out.println("Enter a name list (multiple words per line allowed):");
        String nameListLine = input.nextLine();
        ArrayList<String> nameList = new ArrayList<>();
        for (String item : nameListLine.split("\\s+")) {
            nameList.add(item);
        }
        
        // 输出结果
        System.out.println("Name: " + name);
        System.out.println("Name list: " + nameList);
        
        input.close();
    }
}

内容的提问来源于stack exchange,提问作者Stéphane GRILLON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:31