一不小心就踩坑系列:Java篇(一)

最近在做公司的项目的时候,使用到了Map,在使用的过程中,挖了一个坑给自己,导致接口报错,查了半天才发现问题。

Map是Java集合中的一种,我们使用的时候通常会声明他的Key和Value的类型。公司使用的是泛微OA,在其系统上进行一个二次开发,使用其jdbc操作集时,将返回结果封装成Map<String,Object>来存储查询数据。在使用过程中出现如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
List<Map<String, Object>> result1; // 这个map是由数据库操作集中通过查询获取的
List<Map<String, Object>> result2; // 这个map是查询后以id为key方便完成后面的业务
int currentR1 = 0;
int currentR2 = 0;
while(currentR1 < result.size()) {
Map<String, Object> map = result1.get(currentR1);
int id = (int) map.get("id");
for(int i = currentR2; i < result2.size(); i++) {
Map<String, Object>result = result2.get(i);
float rest = (float) result.get("rest");
float diff = (float) map.get("diff");
if(rest == 0) {
break;
}
if(diff > rest) {
result.set("rest", 0); // 手动清零
map.set("diff", diff - rest);
....省略一堆代码
} else {
....省略一堆代码,比较复杂不想写了
}
}
}

代码大概是上面写的样子,不过重点不在那些代码中,而是在上面手动清零的地方,看起来好像没啥问题,是吧?但是到第二次循环时,还是这个手动置零后的map,在进行转换时,出现了Integer can not cast to Float的异常。没错!在置零时,这个类型就被包装成了Integer类型,而Integer类型是无法转换的类型。而获取时拿到Integer转换Float时,就会出现问题了。所以在这种情况下对类型的转换需要格外小心。