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

Java导入CSV到二维数组出现Array Index Out of Bounds Exception问题

问题根因

  • 核心触发点:你代码中统计的maxLen是所有CSV行的最大列数,但部分行分割后的数组长度小于maxLen,内层循环遍历到超出当前行长度的索引时访问row[y]就会触发越界。比如最长行有45个元素(索引范围0-44),某短行只有10个元素,当y遍历到10的时候就会出现索引10超出长度10的边界的报错。
  • 潜在风险:两次读取文件可能出现内容不一致,导致第二次读取行数少于统计的colCount,readLine返回null后调用split会触发空指针异常;手动关流如果reader初始化失败,调用close()会触发空指针。

修复代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public static String[][] readIn(String file){
    // 用List存临时数据,只需要读取一次文件
    List<String[]> tempRows = new ArrayList<>();
    int maxLen = 0;

    // try-with-resources自动关流,不需要手动处理finally
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = reader.readLine()) != null) {
            String[] row = line.split(",");
            tempRows.add(row);
            if (row.length > maxLen) {
                maxLen = row.length;
            }
        }

        // 初始化二维数组
        String[][] source = new String[tempRows.size()][maxLen];
        for (int x = 0; x < tempRows.size(); x++) {
            String[] row = tempRows.get(x);
            for (int y = 0; y < maxLen; y++) {
                // 当前行有对应元素就赋值,没有就填充空字符串,避免越界
                source[x][y] = y < row.length ? row[y] : "";
            }
        }
        return source;
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 异常情况返回空数组,避免返回null
    return new String[0][0];
}

优化说明

  • 只读取一次文件,减少IO开销同时避免两次读取文件内容不一致的问题
  • 赋值时增加长度判断,短行超出部分填充空值,彻底解决越界问题
  • 用try-with-resources语法自动关闭流,简化代码同时避免手动关流的空指针风险
  • 异常场景返回空数组,避免上层调用出现空指针

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:27:00