从Firestore获取数据加载图片滑块时出现IndexOutOfBoundsException崩溃
错误原因
- 核心问题是
successAdListImageURL方法中手动遍历数组时下标使用错误:Java/Kotlin的ArrayList是0起始索引,你声明循环变量i从1开始,且循环终止条件写为i<=numOfImage,会直接访问到不存在的数组下标。 - 报错信息中的
Index: 1, Size: 1就是典型触发场景:你从Firestore拉到了1条广告数据,数组长度为1,合法下标只有0,但你的循环第一次就访问了下标1,直接触发越界崩溃。
修复方案
提供两种修复方式,优先推荐符合Kotlin语法习惯的遍历写法,避免手动控制下标出错:
方案1:使用Kotlin集合遍历(推荐)
直接遍历adImageURL集合,完全规避下标操作风险:
fun successAdListImageURL(adImageURL: ArrayList<Ads>){ val remoteImages: ArrayList<SlideModel> = ArrayList() // 直接遍历集合元素,无需手动控制下标 for (ad in adImageURL) { remoteImages.add(SlideModel(ad.image_url)) } // 也可以用更简洁的map写法: // val remoteImages = adImageURL.map { SlideModel(it.image_url) } as ArrayList<SlideModel> binding.imageSlider.setImageList(remoteImages, ScaleTypes.CENTER_INSIDE) binding.imageSlider.visibility=View.VISIBLE }
方案2:修正原有循环的下标逻辑
如果要保留手动下标写法,把循环起始值改为0,终止条件改为i < numOfImage:
fun successAdListImageURL(adImageURL: ArrayList<Ads>){ val remoteImages: ArrayList<SlideModel> = ArrayList() val numOfImage=adImageURL.size var i=0 // 起始下标改为0 while (i < numOfImage){ // 终止条件改为小于数组长度 remoteImages.add(SlideModel(adImageURL[i].image_url)) i+=1 } binding.imageSlider.setImageList(remoteImages, ScaleTypes.CENTER_INSIDE) binding.imageSlider.visibility=View.VISIBLE }
额外优化提示:Firestore拉取数据的代码中
ad!!.ad_id = i.id的强非空断言最好替换为非空判断,避免toObject返回空时触发空指针崩溃。
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

