Java中从HashMap对象取值时触发NullPointerException异常怎么处理?
问题根因
你收到的 java.lang.NullPointerException: null 报错翻译为中文为:Java 空指针异常,触发原因是代码中调用了 null 对象的属性或方法。结合你给出的DTO结构、代码、JSON示例,有三个明确的问题点会触发该报错:
- DTO字段无默认初始化:
Datas类的details字段、Details类的dataHashMap字段都没有做初始化,若反序列化框架没有自动创建实例的配置,两个字段默认值为null,调用时直接触发空指针。 - 方法名不符合Java规范:你链式调用中写的
Details()是错误的,标准Java getter方法为驼峰命名,应为getDetails(),方法名错误会导致取值为null。 - HashMap取值key与JSON不匹配:你给出的JSON示例中,
dataMap的key是12345,但代码中用get("data")取值,取不到对应值会返回null,后续调用getName()直接触发空指针。
修复方案
1. 给DTO字段添加默认初始化
class Datas{ // 初始化details避免空对象 private Details details = new Details(); // 补充getter方法 public Details getDetails() { return details; } } class Details{ // 初始化HashMap避免空对象 private HashMap<String, Data> data = new HashMap<>(); // 补充getter方法 public HashMap<String, Data> getData() { return data; } } class Data{ private String name; private String id; // 补充getter方法 public String getName() { return name; } }
2. 修正链式调用并添加空值防护
Java 8及以上版本推荐用Optional做链式判空,避免多层if判断:
String description = Optional.ofNullable(item.get(i)) .map(Item::getDatas) .map(Datas::getDetails) .map(Details::getData) // 替换为JSON中实际的key,示例为12345 .map(dataMap -> dataMap.get("12345")) .map(Data::getName) // 空值时返回默认值,可自定义 .orElse("默认描述"); information.setDescription(description);
低版本Java可使用逐层判空写法:
String description = ""; if (item.get(i) != null && item.get(i).getDatas() != null) { Datas datas = item.get(i).getDatas(); if (datas.getDetails() != null && datas.getDetails().getData() != null) { Data targetData = datas.getDetails().getData().get("12345"); if (targetData != null) { description = targetData.getName(); } } } information.setDescription(description);
内容的提问来源于stack exchange,提问作者welcome_java
相关产品推荐
相关产品推荐

