安卓开发解析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
相关产品推荐
相关产品推荐

