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

Android中onActivityResult内添加元素至ArrayList遇空指针问题求助

解决onActivityResult中ArrayList空指针崩溃的问题

嘿,我来帮你搞定这个头疼的崩溃问题!先直接说核心原因:你的imageInfoArray列表被初始化为null了,而且用了val修饰,导致后续根本没法初始化它,调用add()方法自然就会抛出空指针异常。

问题拆解

看你这段代码:

val imageInfoArray: ArrayList<String?>? = null 

这里有两个致命问题:

  1. 你把列表直接初始化为null,没有创建实际的ArrayList实例,调用add()时肯定会触发空指针
  2. 用val修饰变量,意味着这个变量的引用不能被修改,就算你想之后给它赋值一个新的ArrayList也做不到

而你用var mId没问题,是因为var允许你直接给变量赋值新的字符串引用,不需要调用对象的方法,自然不会触发空指针。

修复方案

第一步:正确初始化ArrayList

把列表改成非空的可变ArrayList,推荐用val修饰引用(因为我们只需要集合本身可变,引用不需要变),直接初始化:

// 直接创建ArrayList实例,类型匹配你要存储的URI字符串
private val imageInfoArray = arrayListOf<String?>()

如果你的Info是自定义数据类(比如用来封装URI和ID),那要把列表类型改成对应的:

// 假设Info是你的自定义数据类
private val imageInfoArray = arrayListOf<Info>()

第二步:修正add方法的类型匹配

你代码里写了imageInfoArray.add(Info(mId)),但如果列表是ArrayList<String?>,这里类型不匹配也会报错。如果是存储URI字符串,直接添加mId即可:

imageInfoArray.add(mId)

如果是用自定义Info类,那确保列表类型是ArrayList<Info>,再添加实例:

imageInfoArray.add(Info(mId))

完整修复后的代码示例

class SellActivity : AppCompatActivity() { 
    private val imgResult = 1 
    // 正确初始化可变ArrayList
    private val imageInfoArray = arrayListOf<String?>() 
    var mId: String? = null 

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 
        super.onActivityResult(requestCode, resultCode, data) 
        if (requestCode == imgResult && resultCode == RESULT_OK && data != null) { 
            data.data?.also { uri -> 
                mId = uri.toString() 
                // 添加URI到列表
                imageInfoArray.add(mId) 
            } 
        } 
    }

    // 后续在上传方法中使用列表里的URI
    private fun uploadImagesAndSendIds() {
        // 遍历所有存储的URI,执行上传逻辑
        for (uriStr in imageInfoArray) {
            uriStr?.let { uri ->
                // 这里写上传图片到服务器、获取ID并发送的代码
                // 比如调用上传接口,处理返回的ID等
            }
        }
    }
}

进阶优化:避免Activity重建丢失数据

如果你的Activity可能发生重建(比如旋转屏幕),上面的列表数据会丢失。推荐用ViewModel来存储数据,这样在Activity生命周期变化时数据能保留:

// 定义ViewModel存储数据
class SellViewModel : ViewModel() {
    val imageInfoArray = arrayListOf<String?>()
}

// 在SellActivity中使用ViewModel
class SellActivity : AppCompatActivity() { 
    // 通过viewModels()获取ViewModel实例
    private val viewModel: SellViewModel by viewModels()
    private val imgResult = 1 
    var mId: String? = null 

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 
        super.onActivityResult(requestCode, resultCode, data) 
        if (requestCode == imgResult && resultCode == RESULT_OK && data != null) { 
            data.data?.also { uri -> 
                mId = uri.toString() 
                // 把数据存在ViewModel的列表里
                viewModel.imageInfoArray.add(mId) 
            } 
        } 
    }

    private fun uploadImagesAndSendIds() {
        // 从ViewModel中获取列表数据
        for (uriStr in viewModel.imageInfoArray) {
            uriStr?.let { uri ->
                // 上传逻辑
            }
        }
    }
}

关于单例崩溃的补充

你说用单例也会崩溃,大概率是单例里的列表同样没有正确初始化,或者在多线程场景下出现问题。按照上面的方式,先确保单例里的列表是已初始化的可变集合,再尝试添加数据,应该就能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:35