java—在for循环中解构时尝试调用空对象

zbdgwd5y  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(329)

这怎么可能?
在后台线程上,我运行一些计算来填充一个列表,然后使一个视图无效,然后视图运行ondraw。

var list = mutableListOf<Pair<DataPoint, String>>()

...

generateBgData() {
    list.clear()
    list.add(...,...)
    invalidate()
}

在ondraw中,我复制了一个列表,以防止列表的更新导致错误,

val listCopy = ArrayList(list)
    for ((point, str)in listCopy) { // Null exception thrown here
        canvas.drawText(...)
    }

但我注意到,在分解结构时,出现了一个空对象引用错误 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object kotlin.Pair.component1()' on a null object reference . 这怎么可能?我的列表是非空的,我从来没有把列表设置为空。如果为空,则for循环不应运行。我在这里重新创建了运行该问题的代码,并且无法复制它,但是在我的play store应用程序中很少发生这种情况。
知道会发生什么吗?

vuktfyat

vuktfyat1#

多线程可能是罪魁祸首。假设在运行此代码时,列表中有一些项:

val listCopy = ArrayList(list)

当arraylist构造函数从列表中复制项时,另一个线程清除列表,这会将所有内容标记为null。如果另一个线程清除列表的速度比这个线程复制引用的速度快,那么它将开始复制列表中最后一个项目的空引用。
如果要修改来自多个线程的数据,我建议只使用只读列表。

相关问题