初始化“ late init”属性时未初始化的异常

时间:2019-03-05 06:34:47

标签: android kotlin kotlin-lateinit

我不太确定是否因延迟初始化属性而无法解决我的问题。但让我问一下:)

我有一个用于几乎所有活动的applicationController-因此我创建了一个BaseActivity

现在的问题是,当我想从child activity中的应用程序控制器获取依赖项时,我得到了Uninitialized Exception

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

因为您覆盖了BaseActivity中的错误方法,所以您的应用程序崩溃了。

解决方案::将代码更改为

abstract class BaseActivity : AppCompatActivity() {

    lateinit var applicationController: ApplicationController

    // [IMPORTANT] Remove or comment-out this method
//    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
//        super.onCreate(savedInstanceState, persistentState)
//        applicationController = ApplicationController.getInstance(applicationContext)
//    }

    // Override this method
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        applicationController = ApplicationController.getInstance(applicationContext)
    }
}

说明::本部分将说明代码为何无法正常工作。

  

kotlin.UninitializedPropertyAccessException

     

这是RuntimeException的子类,应用程序将抛出该异常   通过调用属性或方法访问对象时发生异常   在初始化之前自行解决。

创建LoginScreen活动后,Android会调用其onCreate方法。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_login_screen)

    emailMatcher = applicationController.getEmailMatcher()
    passwordMatcher = applicationController.getPasswordMatcher()
}

第一行super.onCreate(savedInstanceState)将调用其父级的onCreate方法,在这种情况下,将调用onCreate (bundle)活动中的BaseActivity

不幸的是,在BaseActivity活动中,您重写了applicationController的初始代码并将其放在另一个与onCreate(bundle, persistentState)类似的方法onCreate (bundle)中。它们之间的区别在于参数数量。结果,此时applicationController仍未初始化。

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onCreate(savedInstanceState, persistentState)
    applicationController = ApplicationController.getInstance(applicationContext)
}

在应用程序到达此行之前

emailMatcher = applicationController.getEmailMatcher()

由于您在未初始化的对象getEmailMatcher上调用applicationController方法,因此应用抛出kotlin.UninitializedPropertyAccessException并使应用崩溃。