0

这是生成 NPE 的一段代码,如果这还不足以让您了解可能出现的问题,请告诉我。

我有一张以这种方式实例化的地图:

Map<Integer, Set<Long>> myMap = new HashMap<Integer, Set<Long>>();

我正在尝试执行以下操作:

long randomLong = methodReturnsRandomLong();
int randomInt = methodReturnsRandomInt();

if(myMap.isEmpty()) { // the map is empty at this point
   myMap.put(randomInt, new HashSet<Long>());
   myMap.get(randomInt).add(randomLong);
}

// Now I want to remove it
myMap.get(randomInt).remove(randomLong);  // Here is what generates the NPE

我不明白是什么导致了 NPE。我的猜测是new HashSet<Long>()在我的myMap.put()方法中使用导致它。但我不完全确定。

4

1 回答 1

1

发生这种情况是因为地图可能不是空的,但没有randomInt您的值的条目。

您正在寻找的是:

//does a mapping exist for this specific value?
if(!myMap.containsKey(randomInt)){
    myMap.put(randomInt, new Hashset<Long>());
    myMap.get(randomInt).add(randomLong);
}
//now this value will be defined here.
myMap.get(randomInt).remove(randomLong);

调用map.isEmpty只是检查存在映射。您真的想知道该randomInt值是否存在映射,而不是是否存在任何映射。

我知道您说此时地图是空的,但我之前曾多次看到此错误。这通常是与此类似的情况下的原因。

于 2013-08-09T13:46:30.077 回答