lateinit属性dManager尚未初始化

时间:2019-09-23 13:35:08

标签: android kotlin kotlin-lateinit

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

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尚未初始化

这怎么可能发生?我应该怎么做才能防止这种情况?

2 个答案:

答案 0 :(得分:1)

lateinit var使编译器意识到不是空

  1. 如果您的媒体资源是生命周期驱动的(例如,对TextView的引用 或在Android Activity生命周期中膨胀的ImageView) 或通过注入初始化,则不能提供非null 初始化程序,您必须将其类型声明为可为空。这反过来 要求您每次引用 属性,这可能会带来一些不便,特别是如果您 绝对确定该属性会在某个时候被初始化, 在您第一次访问它之前。
  2. 科特林对于这种情况有一个简单的解决方案,允许您使用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) { 
   ...
   ...
   ...
}
}

答案 1 :(得分:0)

可能是您的getDataManager(sp,level,test)返回null

OR

根据文档,您必须使用.isInitialized属性检查对象。

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

Check lateinit var is initialized

lateinit var file: File    

if (::file.isInitialized) { ... }