2016-07-30 75 views
0

我想保存一個應用實例,並在databaseHelper的構造函數中使用,但是當我的活動試圖實例化databaseHelper我得到以下異常:應用程序崩潰,因爲lateinit App實例未初始化

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時,Kotlin拋出UninitializedPropertyAccessException。

我一直在尋找了幾個小時的代碼,也弄不清是什麼,我做錯了。任何幫助都是有福的,提前感謝你們所有人。

+0

您已確認的應用程序的onCreate實際運行添加您的App類作爲Application?可能忘記將其添加到清單。 – FWeigl

+0

非常感謝!我不敢相信我在這上面失去了三個小時,並沒有注意到我在App.onCreate上的斷點沒有做任何事情。 你可以把它寫成一個答案,讓我能接受嗎? :) –

回答

1

不能找出究竟爲什麼你的做法是行不通的,但我可以建議修復:

你需要在你MainActivity一個ForecastDb。您的ForecastDb需要ForecastDbHelper。您的ForecastDbHelper需要Application實例。

因此,在您MainActivity你做:

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

,瞧,你有你的數據庫做好準備。

這被稱爲依賴注入,並允許您更多地控制創建對象自己獲取其依賴關係。

編輯:還要檢查,如果你在AndroidManifest.xml這樣的:

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

我不是專家科特林但似乎同伴對象初始化早些時候,父類的構造函數調用的。也許當你val SOURCES嘗試初始化它拋出異常,因爲它試圖使用未初始化App實例(應用onCreate()之前)。 Here您可以閱讀當對應的類加載(解決)同伴對象初始化,匹配一個Java靜態初始化的語義

+0

好主意,我只是測試,雖然我的應用程序的onCreate加載其他類之前運行,我認爲這種行爲是保證。 – FWeigl

+0

謝謝你的回答,並指出這一點,我沒有注意到這一點,但我認爲你需要註解@JvmStatic來讓他們表現如此。 –

相關問題