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

安卓开发解析CSV取25、26列报ArrayIndexOutOfBoundsException问题求助

问题原因
  • 核心错误java.lang.ArrayIndexOutOfBoundsException: length=2; index=25已经明确说明:你拆分每行CSV得到的字符串数组实际只有2个元素,远少于你预期的60列,问题出在CSV解析逻辑,常见原因如下:
    • 你大概率用了String.split(",")做简单拆分:如果CSV字段本身包含逗号(比如被双引号包裹的含逗号的文本内容),简单按逗号拆分完全无法处理这类转义场景,会导致拆分后的数组长度完全不符合预期
    • 行读取逻辑存在截断,仅获取到了每行CSV的前半段内容,拆分后自然只有2个元素
    • CSV行分隔符识别错误,把完整的一行拆成了多段,每段拆分后都只有少量列
解决方案

1. 替换CSV解析逻辑,使用专业解析库

不要自行实现逗号拆分逻辑,成熟的CSV解析库已经处理了引号转义、特殊字符、编码适配等所有通用场景,安卓端推荐使用opencsv,引入方式如下:
在模块级build.gradle的dependencies代码块中添加依赖:

implementation 'com.opencsv:opencsv:5.6'

2. 调整CSV读取代码

参考示例修改你的CSV读取逻辑,同时添加长度校验避免越界:

// 从URL获取CSV输入流的示例
URL csvUrl = new URL("你的CSV文件远程地址");
InputStreamReader inputReader = new InputStreamReader(csvUrl.openStream(), StandardCharsets.UTF_8);
CSVReader csvReader = new CSVReader(inputReader);

String[] lineContent;
List<State> dataList = new ArrayList<>();
// 若需要跳过表头可执行一次readNext
csvReader.readNext();

while ((lineContent = csvReader.readNext()) != null) {
    // 必须先判断数组长度,避免部分行格式异常导致崩溃
    // 注意数组下标从0开始,第25列对应下标24,第26列对应下标25,所以长度需要≥26
    if (lineContent.length >= 26) {
        State item = new State();
        item.setField1(lineContent[24]);
        item.setField2(lineContent[25]);
        dataList.add(item);
    } else {
        // 异常行可选择跳过或填充默认值
        Log.w("CSV_PARSE", "异常行跳过,列数不足:" + lineContent.length);
    }
}
csvReader.close();
inputReader.close();

// 把dataList传给CSVAdapter刷新ListView即可

3. 额外排查项

如果替换解析库后仍存在问题,可打印每行获取到的原始字符串,确认是否存在网络请求截断、编码识别错误、换行符异常导致的行内容不完整问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:03