3

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

在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;
}

如果我检查是否null使用 Guava 的前提条件,我也会遇到同样的情况

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());
    }
}
4

2 回答 2

0

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

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

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

于 2013-05-22T10:50:22.387 回答
-1

这可能不是警告的原因,但在这里你可以有一个空指针。

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;
    }
}

您迭代对象,但返回的对象可以为空。所以 item.getName() 可能会导致空指针异常。

示例

 List<String> l = new ArrayList<String>();
 l.add("test");
 l.add(null);
 l.add("another string");

 if(l == null)   // <-- this is similar to the above check
    return;

 for(String s : l)
 {
     s.charAt(0);   //  <-- null pointer access on second item.
 }
于 2013-05-22T09:18:43.387 回答