2013-07-02 4 views
5

I持つ二つのハッシュマップHashMapの取得はNULLを返します

HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>(); 
HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>(); 

I持ち、現在確認し、それに追加しますループ:

for(Item item : items){ 
    int currentRequirement = 0; 
    currentRequirement = inventoryRequirements.get(item.get_id()); 
    inventoryRequirements.put(item.get_id(), currentRequirement++);   
} 

I持って在庫をチェックし、それに追加されます別のループ:

for(Item item : items){ 
    int currentInventory = 0; 
    // this next line returns null 
    currentInventory = inventory.get(item.get_id()); 
    inventory.put(item.get_id(), currentInventory++);   
} 

最初のものはうまく動作しますが、2番目のものはうんざりしてnullを返します。なぜ私は2番目のものが動作しないのか分かりません。どちらも最初はコードサンプルに示されているのと同じ状態になっています。

EDIT

あなたがここで見るように2つのHMが読み込まれます - 本当に!私はそれが信じがたいかもしれないが、最初のものは動作し、2番目のものは動作しないことを知っている。

+7

「在庫」に何かを入れたことがありますか?また、 'Map 'を使わないのはなぜですか? – Jeffrey

+2

'inventoryRequirements'が空になると、最初のループも失敗します。 – Joni

+0

それに何かを入れることは決してできません。代わりになぜ地図ではなく、私はそれに対して良い答えがありません - 本当の利点はありますか? –

答えて

1

ご提供いただいたコードが完成した場合は、hashmapに何も入れていません。 したがって、常にnullが返されます。

+0

Trueを使用してください。しかし、その場合、なぜ最初のコードがうまく動作しているのだろうと思いますか? – PVR

+0

それは間違いです。 'foreach'ループ自体は' HashMap'を反復することができません。 – Lion

+0

どうして? Foreachループはリストで反復されています。なぜ失敗するのかがわかりません。 – PVR

0

あなたはinventoryからアイテムを取得しているが、それはあなたがget()を介して要求キーがMapにない場合は、表示されたループの両方がNullPointerException(NPE)をスローします

10

空です。

Map.get()は、キーが存在しない場合(もちろん、そのキーに格納されている値がnullの場合)nullを返します。 nullInteger(autoboxedタイプ)は、intにautounboxすることができないため、NPEをスローします。

これを実行する安全な方法は次のとおりです。もちろん

for (Item item : items) { 
    Integer currentRequirement = inventoryRequirements.get(item.get_id()); 
    if (currentRequirement != null) { 
     inventoryRequirements.put(item.get_id(), currentRequirement++);   
    } 
} 

、それはあなたがは、NPEを投げているものであることをnullであるあなたのコレクションでItemを持っていることも完全に可能です。

+0

+1最後の点は+1ですが、nullを返してnullを返さないと言っていますが、それは 'int'なので意味がありません。 –

+0

'get()'が 'null'を返す場合、それはスローされます。または、彼のJVM /コンピュータが壊れている;)私は 'Item'が' null'、自分自身に傾いています。 –

関連する問題