当前位置: 首页 > 知识库问答 >
问题:

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

寇照
2023-03-14

如果变量是用延迟初始化的,是否有可能具有 NPE?

1/ lateinit var pbar: ProgressBar

2/pbar = findViewById(r . id . pbar _ log in)

3/进行api调用,pbar。可见性=视图.VISIBLE

4/按下并销毁活动(假设所有视图也将被销毁)

5/

override fun onPostExecute() {
    if (pbar != null) { // warning: pbar != null is always true
        pbar.visibility = View.GONE // NPE??
    }
}

问题:

1)如果我不检查- if (pbar!= null)?

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

我已经经历了这个问题,在这种情况下,我进一步的问题是,

对于活动、片段或回收视图中的视图相关变量,有没有避免NPE的最佳实践?

共有1个答案

龙智
2023-03-14

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

不可以。该属性不能为null

但是,无论如何您都可能崩溃。不要尝试修改已销毁的活动,包括更新其视图。要么:

>

  • 使用类似 LiveData 之类的内容来告知活动有关事件的信息,以便活动可以在活动存在时响应事件,但如果活动被破坏,则可以忽略该事件,或者;

    在尝试更新其视图之前,检查活动上的isDestroed以查看它是否已被销毁(也请考虑isFinishing,因为您可能无论如何都不需要为视图更新而烦恼)

    在这两种方法中,我强烈建议使用前一种方法,作为替换 AsyncTask 的一部分。

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

    不,它不能为null,但无论如何都可以崩溃(请参见上文)。

  •  类似资料:
    • 因为我是android开发新手,所以我不知道如何在使用lateinit变量之前初始化它。在此之前,我尝试过执行,就像这个github中提到的,但没有成功。所以现在我希望问题出在初始化textInput变量上。

    • 我想知道是否有一种方法可以检查变量是否已经初始化。例如:

    • 我想知道是否有办法检查变量是否已初始化。例如:

    • 在最后一行显示为时出错 :::: 变量结果可能尚未初始化 这是我的代码:

    • 我正在将一个项目从java迁移到kotlin,该项目使用了许多可能为空的变量,并且在与用户或外部作业进行一些交互之前不会初始化它们。 我试图使用kotlin null安全优势,并且我试图避免在源代码中使用<code>nulllateinitvar location:location?=空 我这样做是为了避免使用< code >?每次我需要使用这些变量时。现在的问题是...如果变量没有初始化会发生什

    • 问题内容: 当我尝试编译时: 我得到这些错误: 在我看来,我在方法的顶部初始化了它们。怎么了 问题答案: 你声明了它们,但没有初始化它们。初始化它们是将它们设置为等于一个值: 因为未初始化变量,但在循环中增加了变量(例如),所以会收到错误消息。 Java原语具有默认值,但如下一位用户所述 当声明为类成员时,它们的默认值为零。局部变量没有默认值