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 に答える