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

Java分割竖线分隔CSV文件时split方法触发数组越界如何解决?

问题分析
  • 错误1:split("|")使用不符合预期。Java中String.split()的入参是正则表达式,|是正则的特殊元字符,代表逻辑或,直接传入"|"会被解析为匹配空字符串,最终拆分结果是单个字符组成的数组,无法按竖线正确分割字段。
  • 错误2:读取文件时向file集合中额外添加了\n字符串,遍历集合时会遇到纯换行的行,该行拆分后的数组长度远小于预期,访问索引5时直接触发数组越界。
修复方案
  1. 读取文件时仅保留实际行数据,不要插入多余的\n
  2. 分割字符串时对|做转义处理,写法为split("\\|")(第一个反斜杠是Java字符串转义,第二个反斜杠是正则语法转义,让|被识别为普通分隔符)

修复后的代码如下:

public List<EquivalenceGroupsTO> read() throws FileNotFoundException, IOException {
    try (BufferedReader br = new BufferedReader(new FileReader("/home/myself/Desk/blaBla/T60.csv"))) {
        List<String> file = new ArrayList<>();
        String line = br.readLine();
        Integer count = 0;
        // 未使用的变量可以删除,比如StringBuilder、HashSet
        while (line != null) {
            count++;
            file.add(line);
            line = br.readLine();
        }

        List<EquivalenceGroupsTO> equivalenceGroupsTOs = new ArrayList<>();
        for (String row : file) {
            EquivalenceGroupsTO equivalenceGroupsTO = new EquivalenceGroupsTO();
            // 转义竖线作为分隔符
            String[] str = row.split("\\|");
            // 添加长度校验避免脏数据报错
            if (str.length >= 8) {
                equivalenceGroupsTO.setEquivalenceGroupsCode(str[5]);
                equivalenceGroupsTO.setDescription(str[7]);
                equivalenceGroupsTO.setLastUpdateDate(new Date());
                equivalenceGroupsTOs.add(equivalenceGroupsTO);
                System.out.println("Tutto ok!");
            } else {
                System.out.println("异常行数据,字段不足:" + row);
            }
        }
        return equivalenceGroupsTOs;
    }
}
补充说明

代码中未使用的StringBuilder、HashSet变量可以直接删除,减少不必要的内存占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:30:01