android - Kotlin 中的非空值产生空指针异常
问题描述
我有一个不可为空的值数组,如下所示:
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 会抱怨,当然我不确定这首先是如何发生的,因为我只在数组中放置了非空值。线程问题?欢迎任何想法:) 谢谢。
解决方案
从与空安全相关的文档中,问题可能是由以下原因引起的:
构造函数中未初始化的
this
可用在某处被传递和使用(“泄漏”)。
换句话说,NullPointerException 将对象描述为尚未初始化。只有在初始化之后,调用方的对象才非空。
我看到了 AsyncTask 中抛出的异常。dog.P()
您可以在初始化之前检查是否有一些异步任务调用。
推荐阅读
- c# - 在多对多关系中播种数据的问题。无法进行迁移
- macos - 在 MacOS 上通过 ssh 访问外部驱动器
- javascript - 如何在 javascript 中获取 document.getElementsByTagName("...") 的值?
- javascript - 登录 asp.net mvc 时出现 500 内部服务器错误
- javascript - Vue js:如何过滤嵌套数组中的每个标签都包含在用户输入标签数组中的数组?
- azure-ad-b2c - 使用邀请注册策略注册后自动登录
- go - Go http 服务器关闭的竞争条件
- angular - canActivate 总是在 Angular 中登录表单?
- java - 使用 java 删除对象 S3 的所有版本
- react-native - 在 React Native 的选项卡栏中打开模式?