我不确定我的情况是否无法使用后期初始化属性。但是让我问一下:)
我有一个几乎在每个活动中都使用的 applicationController - 所以我创建了一个BaseActivity
现在的问题是,当我想从子活动中的应用程序控制器获取依赖项时,我得到了一个未初始化的异常。
谢谢你的帮助!
我不确定我的情况是否无法使用后期初始化属性。但是让我问一下:)
我有一个几乎在每个活动中都使用的 applicationController - 所以我创建了一个BaseActivity
现在的问题是,当我想从子活动中的应用程序控制器获取依赖项时,我得到了一个未初始化的异常。
谢谢你的帮助!
因为您覆盖了错误的方法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
并使您的应用程序崩溃。