You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

初始化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

火山引擎 最新活动