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

时间:2019-07-10 23:01:00

标签: android exception kotlin nullpointerexception

如果使用lateinit初始化变量,是否可以使用NPE?

1 / lateinit var pbar:ProgressBar

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?


我遇到了this问题,在这种情况下,我的进一步问题是

是否存在避免对活动,片段或recyclerview中与视图相关的变量进行NPE的最佳实践?

1 个答案:

答案 0 :(得分:1)

  

如果我不检查-是否(pbar!= null),是否可以获得NPE?

不。该属性不能为null

但是,您仍然可能会崩溃。请勿尝试修改已销毁的活动,包括更新其视图。要么:

  • 使用LiveData之类的内容来告诉活动有关事件的信息,因此,如果活动在周围,活动可以对事件做出响应,但是如果活动被破坏,则可以忽略该事件;或

  • 在尝试更新其视图之前,先检查活动上的isDestroyed是否被销毁(还应考虑isFinishing,因为您可能不必费心处理视图更新)

在这两种方法中,我强烈建议采用前一种方法,以取代AsyncTask

  

同样的问题,如果变量是通过综合扩展生成的,是否会有NPE?

否,它不能为null,但是您仍然可以崩溃(请参见上文)。