gpt4 book ai didi

java - 潜在的空指针访问

转载 作者:行者123 更新时间:2023-12-02 21:54:26 26 4
gpt4 key购买 nike

我遇到了一个目前我不太清楚的奇怪情况:

在 Eclipse 中启用潜在空指针访问警告时,我会收到如下警告(警告位于相应注释之前的行):

protected Item findItemByName(String itemName, Items items) {
boolean isItemNameMissing = null == itemName || itemName.isEmpty();
boolean isItemsMissing = null == items || null == items.getItems() || items.getItems().isEmpty();

if (isItemNameMissing || isItemsMissing) {
return null;
}
// potential null pointer access: the variable items might be null at this location
for (Item item : items.getItems()) {
// potential null pointer access: the variable itemName might be null at this location
if (itemName.equals(item.getName())) {
return item;
}
}

return null;
}

如果我使用 Guava 的先决条件检查 null ,也会发生同样的情况

Preconditions.checkArgument(argument != null, "argument must not be null");

我可以理解,在后一种情况下,用于检查何时发生 IllegalArgumentException 的流分析可能太困难/昂贵甚至不可能,我反过来也不明白为什么编译器会发出警告完全没有(如果我删除检查它们就会消失)。

能否解释一下潜在的空指针访问是如何完成的以及为什么在这两种情况下都会引发它?或者至少给我指出方向。

同时我看看我自己是否发现了......

附录

我已经把它分解到了外壳的核心部分。给定以下类,警告仅显示在方法 sample2 中(正如注释再次指出的那样)。请注意,sample3 方法也不会触发警告。

public class PotentialNullPointerAccess {

public void sample1(final String aString) {

if (aString == null) {
return;
}

System.out.println(aString.length());
}

public void sample2(final String aString) {

boolean stringIsNull = null == aString;

if (stringIsNull) {
return;
}

// Potential null pointer access: The variable aString might be null at this location
System.out.println(aString.length());

}


public void sample3(final String aString) {

System.out.println(aString.length());
}
}

最佳答案

我认为 Ed Merks 在这个论坛帖子中以某种方式回答了这个问题:

http://www.eclipse.org/forums/index.php/t/278687/

据我了解,一旦您假设前面的代码中的变量可能为 null,Eclipse 就会发出警告。您可以通过检查 null (等于或不等于)来做到这一点 - 但您必须将其作为变量分隔在某处,而不仅仅是作为 if'仅表达。

关于java - 潜在的空指针访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16687820/

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