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

Java读取CSV文件触发ArrayIndexOutOfBoundsException异常求助

解决CSV读取时的数组越界异常

先帮你梳理下代码里导致ArrayIndexOutOfBoundsException的几个关键问题,以及对应的修复方案:

1. 二维数组维度完全搞反了

你提到CSV有58列、859行,但你定义的数组是new double[58][859]——Java里二维数组的第一个参数是行数,第二个是列数。这意味着你现在的数组只能容纳58行、859列,和实际数据结构完全相反,当读取到第59行时,自然会触发行索引越界。

修复:把数组定义改成符合实际数据的结构:

myArray = new double[859][58]; // 859行,58列

2. 没有读取CSV的行内容

你的循环逻辑有个致命疏漏:while (scanIn.hasNextLine())判断存在下一行,但从来没调用scanIn.nextLine()把行内容赋值给InputLine。这导致InputLine一直是空字符串,split(",")后得到的数组要么为空,要么只有空元素,循环会无意义地执行直到Rowc超过数组行上限,直接触发越界。

修复:在循环开头读取当前行内容:

while (scanIn.hasNextLine()) {
    InputLine = scanIn.nextLine(); // 先读取当前行内容
    String[] InArray = InputLine.split(",");
    // 后续处理逻辑...
}

3. 字符串比较误用==而非equals()

Java中比较字符串内容不能用==,==比较的是对象引用地址,应该用equals()方法。你这里判断InArray[x]=="nan"会永远匹配不到目标字符串,进而尝试把"nan"转为Double,触发NumberFormatException。

修复:修改判断条件:

if (InArray[x].isEmpty() || InArray[x].equals("nan")){
    myArray[Rowc][x] = -1;
} else {
    myArray[Rowc][x] = Double.parseDouble(InArray[x]);
}

4. 额外的健壮性优化

为避免CSV行的列数和预期不一致导致的列索引越界,建议处理前先限制循环的列数:

int colsToProcess = Math.min(InArray.length, 58);
for (int x=0; x<colsToProcess; x++) {
    // 处理逻辑...
}

修复后的完整代码示例

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Scanner;

public class CsvLoader { // 修正类名,符合Java命名规范
    static double[][] myArray;

    static double[][] setUpArray() {
        myArray = new double[859][58]; // 修正维度:859行,58列
        Scanner scanIn = null;
        int rowCount = 0;
        String inputLine = "";
        String fileLocation = "/location/myCSVfile.csv";

        try {
            scanIn = new Scanner(new BufferedReader(new FileReader(fileLocation)));
            // 限制行数,避免超出数组容量
            while (scanIn.hasNextLine() && rowCount < 859) {
                inputLine = scanIn.nextLine(); // 读取当前行
                String[] inArray = inputLine.split(",");
                int colsToProcess = Math.min(inArray.length, 58);
                for (int x = 0; x < colsToProcess; x++) {
                    if (inArray[x].isEmpty() || inArray[x].equals("nan")) {
                        myArray[rowCount][x] = -1;
                    } else {
                        // 捕获无法转成Double的异常值
                        try {
                            myArray[rowCount][x] = Double.parseDouble(inArray[x]);
                        } catch (NumberFormatException e) {
                            myArray[rowCount][x] = -1;
                        }
                    }
                }
                rowCount++;
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印完整栈轨迹,方便调试
        } finally {
            if (scanIn != null) {
                scanIn.close(); // 关闭资源,避免内存泄漏
            }
        }
        return myArray;
    }

    public static void main(String[] args) {
        double[][] result = setUpArray();
        // 打印前5行前5列数据验证结果
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                System.out.print(result[i][j] + " ");
            }
            System.out.println();
        }
    }
}

补充说明:Java数组索引从0开始,长度为N的数组最大索引是N-1——这也是你之前盲目扩大数组仍报错的核心原因,因为数组维度本身就搞反了,调整维度才是解决问题的根本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:22:08