今天遇到一个问题,找了半个多小时,问题是这样的:
while (true) {
try {
Map<String, Object> taskMap = getTaskMap();
if (taskMap.size() <= 0) {
log.error("未找到初始化任务!!!!");
try {
Thread.sleep(1000);
continue;
} catch (InterruptedException interruptedException) {
log.error("线程休眠失败!!!!");
}
} else {
beginTime = taskMap.get("beginTime").toString();
endTime = taskMap.get("endTime").toString();
interval = Integer.valueOf(taskMap.get("interval").toString());
break;
}
} catch (IOException e) {
log.error("获取初始化任务失败!!!!");
try {
Thread.sleep(1000);
continue;
} catch (InterruptedException interruptedException) {
log.error("线程休眠失败!!!!");
}
}
代码的意思就是走一个方法, 返回一个map,map如果为空,那就休眠,继续去取,直到取到为止,为了测试可行性,我特意返回的空,没想到不走cache,在try里边抛了空指针,找了很久没找到,于是写了个测试类
public class LongTest {
public static void main(String[] args) {
Map<String, String> map = null;
try{
String s = map.get("131321");
} catch (Exception e) {
System.out.println("异常");
}
}
}
运行,发现结果是OK的,所以说,我的写法没错
那就很奇怪了,这边为什么不生效呢?
我把所有代码注释掉,直接写一个空指针,发现还是不行,还是不走cache,这就很奇怪......
继续想,继续看,发现cache的异常不一样,该不会是?
我赶紧尝试,将cache的IO异常改为最顶级异常,启动,测试
??????!!!!!可以了
原因很简单,我捕获的是IO异常,所以空指针捕获不到
个人习惯cache写最顶级异常,但是这个cache是IDEA自己生成的,刚好同事喊我,我就忘了改成最顶级异常...... 真的是坑