You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用有效键访问Java嵌套Map(Map of Map)触发NPE空指针异常

可能的问题原因

  • 键类型不匹配:外层Map的键类型为Long,如果balance.getEmployeeId()的返回值是int/Integer类型,哪怕数值完全一致,HashMap的get方法也会因为类型不匹配返回null(Long.equals(Integer)永远返回false)。
  • 并发读写问题:如果该嵌套Map在多线程环境下共享,且没有加同步措施,可能出现你执行get操作时,对应员工ID的键值对还未完成写入、或是被其他线程误删除的情况,你事后确认键存在也可能是get执行完成后才完成写入导致的。
  • 填充逻辑覆盖不全:如果填充逻辑仅将提交过请假申请的员工加入外层Map,你遍历的年假列表里包含从未提交过请假申请的员工,外层Map自然不存在对应的键,返回值为null,你确认键存在可能是仅校验了有请假记录的员工数据。
  • 数值精度/值异常问题:如果员工ID是从数据库、接口等外部渠道读取,存在超出int范围的Long值被错误转码、精度丢失的可能,看起来和预期ID一致的数值实际和Map中存储的键值不同,导致get返回null。

临时修复方案

可以用getOrDefault规避空指针问题,示例代码如下:

for (AnnualLeaveBalance balance: annualLeaveBalanceList) {
    Map<Integer, Integer> yearToCountMap = employeeYearWiseLeaveAppCount.getOrDefault(
        balance.getEmployeeId(),
        Collections.emptyMap()
    );
    int year = Integer.parseInt(balance.getYear());
    int takenLeave = yearToCountMap.getOrDefault(year, 0);
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者user404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:54:03