求助解决Java中Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:5异常
解决ArrayIndexOutOfBoundsException:5异常的方案
异常原因分析
你遇到的ArrayIndexOutOfBoundsException:5是因为代码直接访问数组的第6个元素(数组索引从0开始),但传入的documents数组长度不足6,导致索引越界。结合你提供的信息,核心问题有两个:
CSV格式不规范:
表头用逗号,分隔,但数据行却用竖线|分隔,且整行数据被双引号包裹。如果你的CSV解析逻辑按逗号分割,整行数据会被当成单个元素,documents数组长度仅为1,自然无法访问索引5;就算按|分割,开头的双引号也会导致字段解析异常,可能出现元素数量不足的情况。代码缺乏长度校验:
原代码仅判断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
相关产品推荐
相关产品推荐

