初始化时出现未初始化异常 "late init" 属性

Uninitialized exception while initializing "late init" property

我不太确定我的案例是否不能使用延迟初始化属性。但是让我问一下:)

我有一个几乎每个 activity 都使用的 applicationController - 所以我创建了一个 BaseActivity

现在的问题是,当我想从 child activity, I get an Uninitialized Exception.

中的应用程序控制器获取依赖项时

感谢您的帮助!

因为您覆盖了 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

This is a sub-class of RuntimeException, the app will throw this exception when you access an object by calling properties or methods on its own before initializing.

LoginScreen创建activity时,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方法,在本例中BaseActivity中的onCreate (bundle)将调用activity。

不幸的是,在 BaseActivity activity 中,您覆盖了 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()

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