[英]Is it possbile to have NPE if variable is initialised with lateinit or synthetic extension?
如果使用lateinit初始化變量,是否可以使用NPE?
1 / lateinit var pbar:進度條
2 / pbar = findViewById(R.id.pbar_login)
3 /進行api調用,pbar.visibility = View.VISIBLE
4 /回滾並銷毀該活動(假設所有視圖也將被銷毀)
5 /
override fun onPostExecute() {
if (pbar != null) { // warning: pbar != null is always true
pbar.visibility = View.GONE // NPE??
}
}
問題:
1)如果我不檢查是否可以得到NPE-if(pbar!= null)?
2)同樣的問題,如果變量是通過綜合擴展生成的,是否會有NPE?
我已經解決了這個問題,在這種情況下,我的進一步問題是,
是否有任何最佳做法來避免針對活動,片段或recyclerview中與視圖相關的變量進行NPE?
如果我不進行檢查,是否有可能獲得NPE-if(pbar!= null)?
否。該屬性不能為null
。
但是,無論如何您都可能崩潰。 請勿嘗試修改已銷毀的活動,包括更新其視圖。 或者:
使用LiveData
類的LiveData
來告訴活動有關該事件的信息,這樣,如果活動在周圍,活動可以對事件做出響應,但是如果活動被破壞,則可以忽略該事件; 要么
在嘗試更新其視圖之前,請在該活動上檢查isDestroyed
,以查看其是否已銷毀(也請考慮isFinishing
,因為無論如何您都無需費心處理視圖更新)
在這兩種方法中,我強烈建議使用前一種方法,以替代AsyncTask
。
同樣的問題,如果變量是通過綜合擴展生成的,是否會有NPE?
不可以,它不能為null
,但是仍然會崩潰(請參見上文)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.