初始化时出现未初始化异常 "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
并使您的应用崩溃。
我不太确定我的案例是否不能使用延迟初始化属性。但是让我问一下:)
我有一个几乎每个 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
并使您的应用崩溃。