[英]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
)。 一個null
的Integer
(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 至少有兩個原因:
呸!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.