簡體   English   中英

如果使用lateinit或合成擴展名初始化變量,是否可以使用NPE?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM