Hashmap get返回null

时间:2013-07-02 17:52:11

标签: java hashmap

我有两个Hashmaps

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。我不明白为什么第二个不起作用。两者最初都处于代码示例中描述的相同状态。

修改

如你所见,两个HM填充 - 真的!我知道这可能很难相信,但第一个有效,第二个没有。

4 个答案:

答案 0 :(得分:12)

如果您通过NullPointerException请求的密钥不在get()中,则您展示的两个循环都会抛出Map(NPE)。

当密钥不存在时,

Map.get()会返回null(当然,如果使用该密钥存储的值为null),则返回Integernull的{​​{1}}(自动装帧类型)无法自动装入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。

答案 1 :(得分:1)

如果您提供的代码已完成,则表示您未在hashmap中添加任何内容。 因此它将始终返回null

答案 2 :(得分:0)

您从inventory获取了一个项目,但它是空的

答案 3 :(得分: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);       
}