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

Java中使用split()方法获取拆分部分遇异常,求代码排查

问题分析与解决方案

你的代码核心问题出在Scanner读取方式和字符串处理逻辑的搭配错误,导致了数组越界和单词拼接的问题:

问题原因

  1. 数组越界异常(IndexOutOfBoundException):
    Scanner的next()方法是按空白字符(空格、换行等)分隔读取的,每次调用只会返回一个独立单词(比如示例文本里的"Pride"、"and")。你处理后的line是单个无空格的单词,调用split(" ")后得到的数组长度永远是1,根本不存在words[5]这个元素,自然会抛出越界异常。

  2. words[0]输出完整拼接文本:
    这说明你大概率误将代码里的sc.next()写成了sc.nextLine()。如果用nextLine()读取整行文本,你的replaceAll("[^a-zA-Z]", "")会把所有非字母字符(包括空格)全部移除,整行文本变成无空格的长字符串,split(" ")自然只能得到一个元素,就是这个拼接后的长串。

修正后的代码方案

方案一:利用Scanner的next()直接读取单个单词(最简单)

既然next()已经帮你按单词分割了,直接处理单个单词后添加到集合即可,完全不需要拆分:

ArrayList<String> content = new ArrayList<>();
Scanner sc = new Scanner(new File("myfile.txt"));
while (sc.hasNext()) {         
    String word = sc.next().toLowerCase().replaceAll("[^a-zA-Z]", "");
    if (!word.isEmpty()) {
        content.add(word);
    }
}
sc.close();

方案二:读取整行后正确分割单词

如果需要读取整行处理,先把非字母字符替换成空格,再按多空格拆分,避免出现空字符串:

ArrayList<String> content = new ArrayList<>();
Scanner sc = new Scanner(new File("myfile.txt"));
while (sc.hasNextLine()) {         
    String line = sc.nextLine().toLowerCase();
    // 将非字母字符替换为空格,保证单词间的分隔
    String cleanedLine = line.replaceAll("[^a-zA-Z]", " ");
    // 按一个或多个空格拆分,自动忽略连续空格导致的空元素
    String[] words = cleanedLine.split("\\s+");
    for (String word : words) {
        if (!word.isEmpty()) {
            content.add(word);
        }
    }
}
sc.close();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:13:17