Java Hashmap get返回null
我有两个哈希图Java Hashmap get返回null,java,hashmap,Java,Hashmap,我有两个哈希图 HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>(); HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>(); 我有另一个循环检查库存并添加到其中: for(Item item : items){ int currentRequi
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被填充了——真的!我知道这可能很难相信,但第一个有效,第二个无效。如果您提供的代码是完整的,那么您没有在
哈希映射中放入任何内容。
因此,如果您通过get()
请求的键不在映射中,它将始终返回null但它是空的如果您通过get()
请求的键不在映射中,则您显示的两个循环都将抛出NullPointerException
(NPE)
Map.get()。整型
(自动装箱类型)为null
的整型
(自动装箱类型)无法自动解装箱为int
,因此它会抛出一个NPE
执行此操作的安全方法是:
for (Item item : items) {
Integer currentRequirement = inventoryRequirements.get(item.get_id());
if (currentRequirement != null) {
inventoryRequirements.put(item.get_id(), currentRequirement++);
}
}
当然,也完全有可能您的集合中有一个项,它是null
,这就是引发NPE的原因 最佳实践是以以下方式编写代码:
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);
}
您是否曾经将
任何东西放入库存
?另外,为什么不使用Map
s呢?如果inventoryRequirements
开始时为空,第一个循环也会失败。它永远不会到达该行来放入任何内容。至于为什么不改为Map呢?我没有很好的答案,这有真正的优势吗?在一个空的HashMap
上调用get(int)
将返回null
@AndroidAddict,因为在第一个和第二个代码段之间显然有其他代码没有显示给我们。真的!!但在这种情况下,我想知道为什么第一段代码运行良好???这是不正确的。如果是这样的话,foreach
循环本身将无法在HashMap
上迭代。为什么??Foreach循环正在列表上迭代。。我不明白它为什么会失败。@PVR他的意思是foreach中的代码会失败,因为Brian在他的回答中说了什么。+1是最后一点,但他确实说它返回null而不是抛出null,但这也没有意义,因为它是一个int
。如果get()
返回null
它抛出。或者,他的JVM/计算机坏了;)我倾向于一个项
为null
,我自己。