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

求助解决Java中Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:5异常

解决ArrayIndexOutOfBoundsException:5异常的方案

异常原因分析

你遇到的ArrayIndexOutOfBoundsException:5是因为代码直接访问数组的第6个元素(数组索引从0开始),但传入的documents数组长度不足6,导致索引越界。结合你提供的信息,核心问题有两个:

  1. CSV格式不规范:
    表头用逗号,分隔,但数据行却用竖线|分隔,且整行数据被双引号包裹。如果你的CSV解析逻辑按逗号分割,整行数据会被当成单个元素,documents数组长度仅为1,自然无法访问索引5;就算按|分割,开头的双引号也会导致字段解析异常,可能出现元素数量不足的情况。

  2. 代码缺乏长度校验:
    原代码仅判断documents是否为空或长度≤0,未校验数组长度是否足够访问索引5,一旦数组元素不足6个就会触发异常。

解决步骤

1. 修复CSV文件格式

统一表头和数据行的分隔符,同时规范字段的引号包裹。可选择以下两种格式之一:

格式一(标准逗号分隔CSV):

docID,docName,docAddress,docPayment,docDate,docFlag
12,"User","park",0.0,20230217,""

格式二(竖线分隔):

docID|docName|docAddress|docPayment|docDate|docFlag
12|"User"|"park"|"0.0"|"20230217"|""

2. 修改代码增加长度校验

在访问documents[5]前,先确保数组长度至少为6,避免越界。修改后的builExtract方法如下:

private DocumentExtract builExtract(String[] documents){
    // 校验数组是否为空,且至少包含6个元素(索引0-5)
    if(documents == null || documents.length < 6){
        DocumentExtract defaultExtract = new DocumentExtract();
        defaultExtract.setFlag(false);
        return defaultExtract;
        // 若需要明确报错,可替换为:
        // throw new IllegalArgumentException("文档数据格式错误,缺少必要字段");
    }

    DocumentExtract documentExtract = new DocumentExtract();     
    String flag = documents[5].trim();

    // 简化flag判断逻辑
    documentExtract.setFlag(!flag.isEmpty() && !flag.equalsIgnoreCase("false"));
        
    return documentExtract;
}

3. 使用专业CSV解析库(推荐)

手动分割字符串处理CSV易出错,推荐使用成熟的CSV解析库(如Apache Commons CSV、OpenCSV),它们能自动处理分隔符、引号、换行等场景。示例代码(Apache Commons CSV):

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class CsvParserExample {
    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("Data.csv");
        // 根据你的CSV格式指定分隔符,此处以竖线为例
        CSVFormat format = CSVFormat.DEFAULT.withDelimiter('|')
                .withHeader() // 读取表头
                .withTrim(); // 自动去除字段前后空格

        try (CSVParser parser = CSVParser.parse(reader, format)) {
            for (CSVRecord record : parser) {
                String docFlag = record.get("docFlag");
                DocumentExtract extract = new DocumentExtract();
                extract.setFlag(!docFlag.isEmpty() && !docFlag.equalsIgnoreCase("false"));
                // 处理其他字段...
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:45:15