11

我有两个哈希图

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++);           
}

第一个工作正常,但第二个呕吐并返回空值。我不明白为什么第二个不起作用。两者最初都处于与代码示例中描述的相同状态。

编辑

如您在此处看到的,这两个 HM 被填充 - 真的!我知道这可能很难相信,但第一个有效,第二个无效。

4

5 回答 5

14

如果您请求的NullPointerException密钥get()不在Map.

Map.get()null当键不存在时返回(或者当然,如果使用该键存储的值是null)。无法自动拆箱的Integer(自动装箱类型),因此它会引发 NPE。 nullint

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

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

当然,也完全有可能你Item的收藏中有一个null就是抛出 NPE 的原因。

于 2013-07-02T18:02:45.720 回答
1

如果您提供的代码是完整的,那么您的hashmap. 所以它总会回来null

于 2013-07-02T17:55:46.513 回答
0

您正在从中获取一个项目,inventory但它是空的

于 2013-07-02T17:58:19.187 回答
0

最佳做法是按以下方式编写代码:

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);       
}
于 2018-07-30T07:25:01.940 回答
0

乌格。此外,当所有其他方法都失败时,不要忽视它没有返回 null 的可能性,因为它没有找到密钥。它可能返回 null,因为当添加键/值对时……添加的值是 null。只是花了比我愿意承认的时间更多的时间来追踪这个。

因此,回顾一下,HashMap 可能返回 null 至少有两个原因:

  • 它没有找到钥匙
  • 它正在查找密钥,但为密钥插入的值为 null

嗬!

于 2022-02-22T01:33:14.263 回答