使用有效键访问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
相关产品推荐
相关产品推荐

