Ошибка приложения из-за того, что экземпляр экземпляра 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 в качестве источника данных, но как только я попытаюсь обратиться к базе данных и, следовательно, к App istance, Kotlin выбрасывает UninitializedPropertyAccessException.

Я смотрю на код часами, не могу понять, что я делаю неправильно. Любая помощь благословляется, благодарю всех вас заранее.

Не могу точно определить, почему ваш подход не работает, но я могу предложить исправить:

Вам нужен ForecastDb в вашем MainActivity . ForecastDb нуждается в ForecastDbHelper . Для вашего ForecastDbHelper нужен экземпляр Application .

Итак, в своем MainActivity вы делаете:

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

и вуаля, ты получил свой БД.

Это называется инъекцией зависимостей и дает вам больше контроля над созданием объектов, которые сами выбирают свои зависимости.

EDIT : Также проверьте, добавлен ли ваш класс App в качестве Application в AndroidManifest.xml следующим образом:

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

Я не эксперт Kotlin, но кажется, что ранее были инициализированы объекты-компаньоны, которые вызывают конструктор родительского класса. Вероятно, когда ваш val SOURCES пытается инициализировать это, он генерирует исключение, поскольку он пытается использовать унифицированный экземпляр App (до App onCreate() ). Здесь вы можете прочитать, что объект-компаньон инициализируется, когда соответствующий класс загружается (разрешен), сопоставляя семантику статического инициализатора Java

Intereting Posts