我试图保存一个应用程序实例并在databaseHelper的构造函数中使用,但当我的活动试图实例化databaseHelper时,我会得到以下异常:
FATAL EXCEPTION:
main Process: com.weatherupp.weatherupp, PID: 29092
java.lang.ExceptionInInitializerError
at com.weatherupp.weatherupp.ui.MainActivity.onCreate(MainActivity.kt:27)
[...]
Caused by: kotlin.UninitializedPropertyAccessException: lateinit
property instance has not been initialized
导致异常的代码如下:
MainActivity {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val provider = ForecastProvider()
[...]
}
ForecastProvider有以下配套对象:
companion object {
val SOURCES = listOf(ForecastServer(), ForecastDb())
}
ForecastDb的构造函数引用了ForecastDbHelper的一个实例,其构造函数引用了App.instance,声明如下:
class App : Application() {
companion object {
lateinit var instance: App
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
如果我注释所有引用数据库的代码,应用程序将使用ForecastServer作为数据源,但当我尝试引用数据库并因此引用应用程序实例时,Kotlin抛出UninitializedPropertyAccessException。
我已经看了几个小时的代码,不知道我做错了什么。任何帮助都是幸运的,提前感谢大家。
无法准确指出您的方法不起作用的原因,但我可以建议一个解决方案:
您的MainActivity
中需要一个ForecastDb
。您的ForecastDb
需要一个ForecastDbHelper
。您的ForecastDbHelper
需要Application
实例。
所以在你的MainActivity
中你做了:
val helper = ForecastDbHelper(application as App)
val db = ForecastDb(helper)
瞧,你的数据库已经准备好了。
这被称为依赖项注入,它使您能够更好地控制对象的创建,"获取"它们自己的依赖项。
EDIT:同时检查您是否将App
类添加为AndroidManifest.xml
中的Application
,如下所示::
<application
android:name=".base.App"
...
我不是Kotlin专家,但似乎伴随对象是在调用父类构造函数之前初始化的。可能当您的val SOURCES
尝试初始化时,它会在尝试使用单元化的应用程序实例时抛出异常(在应用程序onCreate()
之前)。在这里,您可以看到当加载(解析)相应的类时,伴随对象被初始化,与Java静态初始化器的语义匹配
我也遇到了同样的问题。请检查应用程序清单中是否存在此声明
<application
android:name=".YourApp"
/>
在你的情况下,应该是
<application
android:name=".App"
/>