1

我正在尝试保存一个 Application 实例并在 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。

我一直在看代码几个小时,无法弄清楚我做错了什么。任何帮助都是有福的,提前感谢大家。

4

3 回答 3

3

无法准确指出您的方法不起作用的原因,但我可以建议修复:

你需要一个ForecastDb在你的MainActivity. 您ForecastDb需要一个ForecastDbHelper. 您ForecastDbHelper需要Application实例。

所以在你的MainActivity你做:

val helper = ForecastDbHelper(application as App)
val db = ForecastDb(helper)  

瞧,你的数据库准备好了。

这称为依赖注入,让您可以更好地控制对象“获取”它们自身的依赖关系的创建。

编辑:还要检查你是否像这样添加了你的App类::ApplicationAndroidManifest.xml

<application
    android:name=".base.App" 
    ...
于 2016-07-30T20:31:03.503 回答
1

我不是 Kotlin 专家,但似乎伴随对象在调用父类构造函数之前被初始化。可能当您val SOURCES尝试初始化时,它会在尝试使用未初始化的 App 实例(在 App 之前onCreate())时引发异常。在这里你可以读到一个伴生对象在相应的类被加载(解析)时被初始化,匹配 Java 静态初始化器的语义

于 2016-07-30T20:08:39.887 回答
0

我遇到了同样的问题。请检查此语句是否存在于应用清单中

<application
android:name=".YourApp"
/>

在你的情况下应该是

 <application
    android:name=".App"
    />
于 2018-08-07T22:34:30.547 回答