数组对象数量过大引发ArrayIndexOutOfBoundsException问题求助
解决ArrayIndexOutOfBoundsException:分割后数组长度不足导致的越界问题
兄弟,看了你的问题和代码,我一眼就瞅出问题出在哪了!你遇到的ArrayIndexOutOfBoundsException: length=5; index=5意思特别明确:你尝试访问一个长度为5的数组的第6个元素(数组索引从0开始算),这不炸才怪!
问题根源分析
小数据量时正常,800条数据就崩溃,核心原因是:某条data[i]字符串用[*]分割后,得到的数组只有5个元素,但你直接去取splitArray[5]。小数据量时刚好所有条目都符合“用分割后有6个字段”的格式,所以没出问题;但数据量变大后,混进了一两条格式不符合的条目(比如少了一个分隔的字段),导致split后的数组长度不够6,直接访问索引5就触发了越界异常。
解决方案
1. 先加防御性检查,避免崩溃
在处理split后的数组前,先检查它的长度是否等于6,不符合的条目直接跳过(或者记录日志方便排查),修改你的deliverResult方法里的循环部分:
for (int i=0; i<data.length; i++) { String imagePath = "http://image.tmdb.org/t/p/w185/" ; int imageId; String title; String overview; String rating; String releaseDate; String[] splitArray; try { splitArray = data[i].split("[*]"); // 关键:先校验分割后的数组长度是否符合要求 if (splitArray.length != 6) { Log.e("MainActivity", "数据格式错误,索引" + i + "的条目分割后长度为" + splitArray.length + ",内容:" + data[i]); continue; // 跳过这条错误数据,继续处理下一条 } } catch (PatternSyntaxException e) { Log.e("MainActivity", "分割正则表达式错误", e); continue; } imagePath+=splitArray[2]; imageId = Integer.valueOf(splitArray[0]); title = splitArray[1]; rating = splitArray[3]; overview = splitArray[4]; releaseDate = splitArray[5]; posters[i] = new Poster( imageId, imagePath, title, overview, rating, releaseDate); }
2. 从源头修复数据格式问题
上面的代码能避免崩溃,但你得去排查生成data数组的源头(比如网络请求返回的数据、本地存储的数据源),看看是不是某些条目少了*分隔符,或者字段为空导致分割后长度不足。从源头修复数据格式,才能彻底解决问题。
3. 额外建议:用更安全的方式解析结构化数据
尽量别用split来解析这种多字段的结构化数据,推荐用JSON格式传递数据,然后用Gson/Jackson这类库来解析,不仅更安全,后续维护也更方便,不会因为分隔符的问题踩坑。
内容的提问来源于stack exchange,提问作者codingcorgi
相关产品推荐
相关产品推荐

