我遇到了一个我目前还不清楚的奇怪情况:
在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());
}
}