初始化HashMap<Integer,List<Human>>触发NullPointerException问题求助
解决HashMap初始化后触发空指针的问题
嘿,我来帮你搞定这个空指针问题~
首先得揪出你代码里的核心问题:你初始化HashMap时指定的100是初始容量,不是说这个Map里已经有100个键值对了!刚创建的HashMap,hm.size()返回的是0,所以你的for循环根本不会执行哪怕一次——也就是说,你的HashMap从头到尾都是空的。这时候调用hm.get(3)会返回null,再对null调用add(x),自然就触发java.lang.NullPointerException了。
下面给你两种可行的解决方案:
方案1:提前初始化所有需要的键值对
如果你确实需要给0到99这100个key都预先绑定一个空的ArrayList,把循环条件改成直接循环100次就行,别用hm.size():
HashMap<Integer, List<Human>> hm = new HashMap<>(100); // 循环0到99,共100次 for (int j = 0; j < 100; j++) { hm.put(j, new ArrayList<>()); } // 现在调用就不会空指针了 Human x = new Human(); hm.get(3).add(x);
方案2:按需初始化(更优雅)
如果你不需要提前给所有key都创建列表,而是用到某个key的时候再创建,推荐用HashMap的computeIfAbsent方法,它能自动处理“key不存在就创建对应列表”的逻辑,代码更简洁还能避免空指针:
HashMap<Integer, List<Human>> hm = new HashMap<>(100); Human x = new Human(); // 如果key=3不存在,就创建新的ArrayList,然后返回这个列表并执行add操作 hm.computeIfAbsent(3, k -> new ArrayList<>()).add(x);
额外补充一句:HashMap的初始容量只是底层存储数组的大小,用来优化扩容性能,和Map中实际的元素数量(size)完全是两回事——只有当你调用put添加元素时,size才会增加哦。
内容的提问来源于stack exchange,提问作者user9467051




