Kotlin中的非null值会产生nullpointerexception

时间:2018-10-26 19:42:37

标签: android arraylist android-asynctask nullpointerexception kotlin-null-safety

我有一个非空值数组,如下所示:

private val dogs = ArrayList{Dog}() // replace {} with <>

它是这样填充的:

val dog = Dog()  
dog.name = “bob”  
dogs.add(dog)  

最多有3种不同的方法可以像这样填充它,具体取决于代码流。 数组填满后,将对其进行处理:

if (dogs.size > 0) {  
    Collections.sort(dogs, Dog.comparator)  
    for (i in dogs.indices) {  
        val dog = dogs[i]  
        dog.bark()  
    }  
}

所有这些操作都是在AsyncTask doInbackground中完成的。

我在调用dog.bark()时间歇性地收到以下异常:

致命异常:java.lang.RuntimeException 执行doInBackground()时发生错误

Caused by java.lang.NullPointerException: Attempt to invoke virtual method com.myname.model.Dog.P()' on a null object reference
       at com.myname.util.RunnableAsync.doInBackground(SourceFile:5)
       at android.os.AsyncTask$2.call(AsyncTask.java:333)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

简而言之,非null对象的ArrayList有时包含一个null对象。 我试图弄清楚这是怎么发生的。我希望Kotlin会抱怨如果将非空值添加到ArrayList中,当然,我不确定如何首先发生这种情况,因为我只将非空值放入了数组中。线程问题?任何想法都欢迎:)谢谢。

1 个答案:

答案 0 :(得分:0)

使用Collections.synchronizedList(ArrayList())。 我唯一能提出的解释是线程问题,该问题通过同步集合得以解决。