应用程序崩溃,因为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) 

瞧,你准备好你的分贝了。

这就是所谓的依赖注入(dependency injection),让你更有效地控制对象自己创建依赖关系。

编辑 :另外检查,如果你添加你的App类作为ApplicationAndroidManifest.xml像这样::

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

我不是一个Kotlin专家,但似乎伴侣对象初始化调用父类的构造函数。 可能当你的val SOURCES尝试初始化它会抛出异常,因为它试图使用单位化的应用程序实例(之前的应用程序onCreate() )。 在这里你可以看到, 当对应的类被加载(解析)时,伴随对象被初始化,匹配Java静态初始化器的语义