应用程序崩溃,因为 lateinit 应用程序实例未初始化

App crashing because lateinit App instance not initialized

我试图保存一个 Application 实例并在 databaseHelper 的构造函数中使用,但是当我的 activity 尝试实例化 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。

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

我不是 Kotlin 专家,但似乎伴随对象在调用父 class 构造函数之前进行了初始化。可能当您的 val SOURCES 尝试初始化时它抛出异常,因为它尝试使用未初始化的 App 实例(在 App onCreate() 之前)。 Here 你可以读到 伴随对象在加载(解析)相应的 class 时被初始化,匹配 Java 静态初始化器的语义

无法准确指出您的方法无效的原因,但我可以提出修复建议:

您的 MainActivity 中需要一个 ForecastDb。您的 ForecastDb 需要一个 ForecastDbHelper。您的 ForecastDbHelper 需要 Application 实例。

因此在您的 MainActivity 中您会:

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

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

这称为依赖项注入,让您可以更好地控制对象的创建 'fetching' 它们本身的依赖项。

编辑:还要检查您是否将 App class 添加为 AndroidManifest.xml 中的 Application,如下所示: :

<application
    android:name=".base.App" 
    ...

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

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

你的情况应该是

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