0

我的片段类中有一个变量:

private lateinit var dManager: DataManager

我在第一次使用之前初始化它:

override fun onResume() {
    super.onResume()
    dManager = MyApp.gManager.getDataManager(sp,level,test)
    if (dManager.hp< 1) { 
       ...
       ...
       ...
    }
}

这段代码对我和大多数用户 (99.5%) 都适用,但有时我会收到崩溃报告

lateinit 属性 dManager 尚未初始化

这怎么可能发生?我应该怎么做才能防止它?

4

2 回答 2

1

lateinit var 使编译器知道它不为空

  1. 如果您的属性是生命周期驱动的(例如,对在 Android Activity 生命周期期间膨胀的 TextView 或 ImageView 的引用)或者它是通过注入进行初始化的,则您不能提供非空初始化程序,并且必须将其类型声明为可空。这反过来又要求您在每次引用该属性时使用空值检查,这可能有点不方便,特别是如果您绝对确定该属性将在第一次访问它之前的某个时间点被初始化。
  2. 对于这种情况, Kotlin有一个简单的解决方案,允许您使用 lateinit 修饰符标记属性。
  3. 如果您在初始化之前访问该属性,您将获得 UninitializedPropertyAccessException

getDataManager(sp,level,test)有时可能会返回 null 因此为了安全起见,您的解决方案将如下所示:-

override fun onResume() {
super.onResume()
dManager = MyApp.gManager.getDataManager(sp,level,test)
if (::dbManager.isInitialized && dManager.hp< 1) { 
   ...
   ...
   ...
}
}
于 2019-09-23T23:29:08.823 回答
0

可能是你的getDataManager(sp,level,test)回报null

或者

根据文档,您必须检查具有.isInitialized属性的对象。

Returns true if this lateinit property has been assigned a value, and false otherwise.

检查 lateinit var 是否已初始化

lateinit var file: File    

if (::file.isInitialized) { ... }
于 2019-09-23T13:43:34.847 回答