Java嵌套HashMap访问键值出现NullPointerException问题求助
问题排查与解决方案
报错根因
你遇到的空指针异常是链式调用HashMap.get()时,某一层的get返回了null,后续对null调用get()方法就触发了该异常,常见触发场景有以下几种:
- 调用
getData()之前没有执行hashMapData()方法:map1初始化后是空集合,所有的嵌套Map数据填充逻辑都在hashMapData()中,未执行该方法的情况下map1.get("ENG02")直接返回null,后续调用get()就会报错 - 数据填充时对应层级的key不存在:哪怕执行了
hashMapData(),如果循环存数据的逻辑没有写入ENG02、CENTRE092、1352中任意一个key,都会导致对应层级get返回null - key匹配错误:存数据和取数据的key存在大小写差异、首尾空格等隐藏差异,导致无法匹配到对应值
修复方案
1. 调整执行顺序&优化调用逻辑
确保先执行hashMapData()初始化数据,再调用getData(),同时避免直接链式调用get(),逐层判空定位问题:
public void getData() { HashMap<String, HashMap<String, String>> map2 = map1.get("ENG02"); if (map2 == null) { System.out.println("未找到对应试卷代码:ENG02"); return; } HashMap<String, String> map3 = map2.get("CENTRE092"); if (map3 == null) { System.out.println("ENG02试卷下未找到对应考点:CENTRE092"); return; } String studentName = map3.get("1352"); if (studentName == null) { System.out.println("CENTRE092考点下未找到对应考生:1352"); return; } System.out.println(studentName); }
2. 封装数据写入方法避免中间层为空
用computeIfAbsent实现自动创建嵌套Map,不用手动初始化每层结构,避免中间层漏存:
// 封装写入方法 public void putExamData(String paperCode, String centreCode, String studentCode, String studentName) { map1.computeIfAbsent(paperCode, k -> new HashMap<>()) .computeIfAbsent(centreCode, k -> new HashMap<>()) .put(studentCode, studentName); } // 调用示例,直接写入三层数据 putExamData("ENG02", "CENTRE092", "1352", "ABCDE");
3. 调试验证key是否存在
如果还是报错,可以打印各层的key集合确认数据是否正确写入:
// 打印所有已存试卷代码 System.out.println("已存试卷代码:" + map1.keySet()); if (map1.containsKey("ENG02")) { // 打印ENG02下的所有考点代码 System.out.println("ENG02下已存考点:" + map1.get("ENG02").keySet()); if (map1.get("ENG02").containsKey("CENTRE092")) { // 打印CENTRE092下的所有考生编号 System.out.println("CENTRE092下已存考生编号:" + map1.get("ENG02").get("CENTRE092").keySet()); } }
额外注意:你代码中的
system.out.println存在语法错误,需要改为首字母大写的System.out.println,否则会触发编译错误。
内容的提问来源于stack exchange,提问作者rino
相关产品推荐
相关产品推荐

