潜在的空指针访问

时间:2013-05-22 09:09:29

标签: java null guava compiler-warnings eclipse-jdt

我遇到一种奇怪的情况,目前我并不清楚:

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

2 个答案:

答案 0 :(得分:0)

我认为Ed Merks在此论坛帖子中以某种方式回答:

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

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

答案 1 :(得分:-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;
    }
}

迭代对象,但返回的对象可以为null。因此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.
 }