我遇到了一个目前我不太清楚的奇怪情况:
当有潜在的空指针访问在 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
将会发生的可能太困难/昂贵甚至不可能,我反过来也不明白为什么编译器会发出警告(如果我删除检查它们就会消失)。
有人可以解释一下潜在的空指针访问是如何完成的以及为什么在这两种情况下都会引发它吗?或者至少给我指明方向。
与此同时,我看看我自己是否发现了......
Addendum
我已经把它分解到了案件的核心部分。给定以下类,警告仅显示在方法中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());
}
}