簡體   English   中英

Hashmap 獲得回報 null

[英]Hashmap get returns null

我有兩個哈希圖

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

我有一個循環檢查當前並添加到它:

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

我有另一個循環檢查庫存並添加到它:

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

第一個工作正常,但第二個嘔吐並返回 null。我不明白為什么第二個不起作用。 如代碼示例中所述,兩者最初都位於相同的 state 中。

編輯

正如您在此處看到的那樣,兩個 HM 得到填充 - 真的。 我知道這可能很難相信,但第一個有效而第二個無效。

如果通過get()請求的密鑰不在Map ,則顯示的兩個循環都將拋出NullPointerException (NPE)。

當鍵不存在時, Map.get()返回null (當然,如果使用該鍵存儲的值為null )。 一個nullInteger (autoboxed類型)無法自動裝入int因此它會拋出一個NPE。

執行此操作的安全方法是:

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

當然,你的集合中的Item也完全有可能是null 這就是拋出NPE的東西。

如果您提供的代碼是完整的,那么您沒有在hashmap任何內容。 所以它總是返回null

您從inventory中獲取了一件商品,但它是空的

最佳做法是以下列方式編寫代碼:

for(Item item : items){
int currentRequirement = 0;
currentRequirement = inventoryRequirements.get(item.get_id());
if(currentRequirement!=null){
//update currentRequirement only if it exists in the map.
   inventoryRequirements.put(item.get_id(), currentRequirement++); 
} else {
   //add it to the map otherwise.
   inventoryRequirements.put(item.get_id(), 1);       
}

哎呀。 此外,當所有其他方法都失敗時,不要忽視它沒有返回 null 的可能性,因為它沒有找到密鑰。 它可能會返回 null,因為當添加鍵/值對時...添加的值是 null。只是花了比我願意承認的更多的時間來追蹤它。

因此,回顧一下,HashMap 可能會返回 null 至少有兩個原因:

  • 不是找不到鑰匙
  • 它正在查找密鑰,但為該密鑰插入的值是 null

呸!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM