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



我试图保存一个应用程序实例并在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"
    />

最新更新