【问题标题】:Non-null value in Kotlin produces nullpointerexceptionKotlin 中的非空值产生空指针异常
【发布时间】:2019-03-31 14:32:29
【问题描述】:

我有一个不可为空的值数组,如下所示:

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)

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

【问题讨论】:

  • 您的代码永远不会显示您调用Dog.P() 的实例。如果您用假设的代码替换了您的代码,请不要这样做。发布您的实际代码,以及更多内容。
  • 此跟踪来自分析服务,它发生在真实的客户设备上。方法名称被混淆,但它是正确的调用。我无法在我的测试实验室中重现该问题,否则我会发布确切的堆栈跟踪。
  • 那就帮不上忙了。大多数崩溃报告服务都允许您上传混淆应用的映射文件,以获得正确的堆栈跟踪。
  • 正如我之前所说,我将代码与堆栈跟踪匹配,没有任何歧义。我不确定在堆栈跟踪中还有什么帮助。从后台线程尽可能完整。
  • 我什至对一个通用的想法(不是特定于代码)感兴趣,什么可能导致声明为包含非空值的 ArrayList 在 Kotlin 中具有空值。例如,2 个线程同时访问数组添加新元素。读取数组的第 3 个线程在被另一个线程更新时能否获得空元素?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    doc 与空安全相关的问题可能是由以下原因引起的:

    在构造函数中可用的未初始化this 被传递并在某处使用(“泄漏”)。

    换句话说,NullPointerException 将对象描述为尚未初始化。只有初始化后,调用方的对象才非空。

    我看到了 AsyncTask 中抛出的异常。您可以在初始化之前检查是否可能有一些异步任务调用dog.P()

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2016-09-22
      相关资源
      最近更新 更多