Map<String, Object> 这样接收数据,查询key对应的value是object,但这个object实际上是hashmap,直接用object.get取数据会报错,该如何取object里面的数据?
可以将其强制转换为HashMap
类型,然后使用get()
方法从中获取数据。下面是一种可能的解决方法:
Map<String, Object> map = new HashMap<>();
// 假设您已经将数据存储在map中
Object obj = map.get("key");
if (obj instanceof HashMap) {
HashMap<String, Object> innerMap = (HashMap<String, Object>) obj;
// 使用innerMap来操作内部的HashMap对象
// 例如:
Object value = innerMap.get("innerKey");
// 对value进行进一步的处理
if (value != null) {
s = value.toString();
}
} else {
// 处理不是HashMap类型的情况
}
首先,使用get()
方法从外部的Map
中获取到对应的Object
对象。然后,通过instanceof
关键字判断该对象是否是HashMap
类型。如果是,就可以将其强制转换为HashMap
类型,并使用innerMap.get()
方法从其中获取具体的数据。如果对象不是HashMap
类型,则需要根据实际情况进行相应的处理。请注意,强制类型转换可能会导致ClassCastException
异常,因此在进行强制转换之前最好进行类型检查。
下面是个实践的例子:
String s =((HashMap<String, Object>) (stringObjectMap.get(eList.get(i).getUnit()))).get("ci").toString()
大家思考一下,上面这句代码哪些地方可能产生空指针异常,该如何修改?
这句代码可能在以下两个地方产生空指针异常:
-
stringObjectMap.get(eList.get(i).getUnit())
:如果eList.get(i).getUnit()
返回的值在stringObjectMap
中不存在对应的键,则返回null
,那么后续的类型转换(HashMap<String, Object>)
就会导致空指针异常。您可以通过先检查是否为null
来避免这个问题。 -
.get("ci")
:如果之前得到的对象不是一个HashMap
,或者HashMap
中没有名为"ci"
的键,则调用.get("ci")
也会导致空指针异常。您可以在调用.get("ci")
之前,先确保对象不为空并且是一个HashMap
对象。
下面是修改的建议代码,以防止空指针异常:
String s = "";
Object unitObj = stringObjectMap.get(eList.get(i).getUnit());
if (unitObj instanceof HashMap) {
HashMap<String, Object> unitMap = (HashMap<String, Object>) unitObj;
Object ciObj = unitMap.get("ci");
if (ciObj != null) {
s = ciObj.toString();
}
}
在修改后的代码中,我们首先将 stringObjectMap.get(eList.get(i).getUnit())
的结果存储在 unitObj
变量中,并进行了类型检查。如果 unitObj
是一个 HashMap
对象,我们再尝试从中获取 "ci"
的值,并将其存储在 ciObj
中。最后,我们通过检查 ciObj
是否为空,来决定是否将其转换为字符串并赋值给 s
。这样可以避免空指针异常的发生。