gpt4 book ai didi

java - 执行空检查而不引发 NullPointerException 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 06:31:24 25 4
gpt4 key购买 nike

所以我知道我可能有一个空列表(特别是ArrayList)。现在,当我已经检查它时,对它进行简单的检查实际上会抛出 NullPointerException 。这让我很困惑,因为我一直成功地使用它,但我确信我错过了一些东西:

public class MyPost {

private int id;

private List<Label> labels;

public MyPost(int id){ this.id = id }

//getter setters for both plus this added method:

public void addLabel(Label aLabel)
{
if(labels == null)
labels = new ArrayList<Label>();

labels.add(aLabel);
}

}

现在,在代码的另一部分中,我正在迭代客户端发送的 ID 列表。为简单起见,假设循环变量“i”提供 ids

MyPost aPost = new MyPost(i);

按照我的逻辑,我可能会也可能不会在帖子中添加标签。因此,在继续之前,最后我会检查是否存在这样的标签:

if(aPost.getLabels()!=null)
//process labels

现在,如果标签列表中没有添加任何内容,则会引发空指针异常!但这正是我想要检查的内容,并且我仍然得到 NPE!!!

我知道如果没有添加任何内容,aPost.getLabels() 就是 null。但比较似乎失败并抛出 NPE。如何解决这个问题?只是让我难住了!

更新:这是获取标签代码。只是一个简单的 setter/getter ...

public List<Label> getLabels() { return labels;}

我们注意到了一些我们之前忽略的事情。我确信java习惯于“短路”它是if条件,即在OR条件中,如果第一个条件评估为真,则不会检查第二个条件(如果第一个条件评估为假,则AND的类似短路)。我不完全确定这是否是原因,但这是 if 子句:

if(aPost.getLabels()!=null || !aPost.getLabels().isEmpty())
//process labels

如果列表确实为空,短路不应评估第二个条件,对吗?看起来可能是这个原因,但我们仍在测试中。现在只是一个预感...

最佳答案

一般来说,调试 NPE 时要做的第一件事是仔细检查堆栈跟踪并确定抛出它的确切行。

下一步是检查该行解引用运算符 ( . ) 左侧的所有值。 NPE 的另一个来源是 for 的新版本。循环,第三个是自动拆箱,据我所知,没有其他构造本身会抛出 NPE,尽管当然总是可以有代码显式抛出它。

所有这一切意味着,如果没有堆栈跟踪和完整的代码,我们也只能猜测。

(或者,如果您使用 IDE,您可以简单地设置异常断点并检查抛出 NPE 时变量的运行时值。但是您应该能够通过离线分析来找到 NPE代码和堆栈跟踪。这是一项重要技能。)

更新:查看更新后的问题,很明显 if 语句是错误的。它应该是:

if(aPost.getLabels()!=null && !aPost.getLabels().isEmpty())
//process labels

OR 不是正确的操作,因为您想要 aPost.getLabels()不为空且不为空。 Java 确实会在知道值后立即停止 boolean 表达式求值,但在您的原始表达式中,情况并非如此 if aPost.getLabels()为空。

关于java - 执行空检查而不引发 NullPointerException 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6910529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com