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
相关产品推荐
相关产品推荐

