版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
有时候调试程序的时候,真的是会让人心态有点崩溃,没有捕获到错误,但是程序运行出来的结果就是不对。按照我同事的话说:“我的代码有它自己的思想”。
今天的情况是,在同步一个订单时,会先同步头表,再同步行表。执行后提示正常,但是只提示同步头表成功,行表没进行同步,程序就结束了。部分代码如下:
// 同步ASN到货单头
OmOrderDeliverHeaderSynService omOrderDeliverHeaderSynService = new OmOrderDeliverHeaderSynService();
if (omOrderDeliverHeaderSynService.dosyn(db, ac) < 0) {
ac.getActionResult().setSuccessful(false);
ac.getActionResult().addErrorMessage("ASN到货单头同步时出现异常!");
return;
}
// 同步ASN到货单行
OmOrderDeliverLinesSynService omOrderDeliverLinesSynService = new OmOrderDeliverLinesSynService();
if (omOrderDeliverLinesSynService.dosyn(db, ac) < 0) {
ac.getActionResult().setSuccessful(false);
ac.getActionResult().addErrorMessage("ASN到货单行同步时出现异常!");
return;
}
给我的感觉是程序运行到第5行后直接返回了。那就意味着同步的数据条数<0,及单据头同步时出现了异常。下面是单据头同步时部分代码:
//前面省略若行代码
ac.getActionResult().addSuccessMessage(
"ASN到货单头同步新增数据" + insertCount + "条,更新数据" + updateCount
+ "条!");
ac.getActionResult().addSuccessMessage("同步耗时:"+DateFormateUtil.getTimeCost(endTime, beginTime)+"(s)");
return 0;
} catch (JDBCException e) {
logger.error(e.getMessage());
try {
db.execute("rollback");
} catch (JDBCException e1) {
logger.error(e1.getMessage());
}
return -4;
} catch (ParseException e) {
logger.error(e.getMessage());
try {
db.execute("rollback");
} catch (JDBCException e1) {
logger.error(e1.getMessage());
}
return -5;
}catch (Exception e) {
logger.error(e.getMessage());
try {
db.execute("rollback");
} catch (JDBCException e1) {
logger.error(e1.getMessage());
}
return -6;
} finally {
// 记录日志信息
InterfaceLogDao.insertInterfaceLog(db, logBean);
}
页面显示同步成功,那第一行代码肯定执行到了。其实最开始,所有捕获异常我都返回的-4,还没怎么发现错在哪儿,后面改成不一样的错误代码后,发现返回值为-6。当时多多少少有些惊讶。将最后一个catch (Exception e){ }给去掉后,程序没有编译错误,说明这个类的所有异常都是捕获到了的。然后将目光锁定同步耗时的那行代码上,下面是对应方法部分代码。
public static float getTimeCost(String endTime , String beginTime) throws ParseException{
//开始时间
long beginSecond = Long.parseLong(beginTime);
//结束时间
long endSecond = Long.parseLong(endTime);
//花费时间
return ((float) (endSecond - beginSecond)/1000f);
}
结合错误提示,应该是将字符串转换成long类型的时候出的问题,比如2019-10-11 10:10:10这个字符串转换的时候就会报错。然后将代码修改至如下,则成功解决问题。
public static float getTimeCost(String endTime , String beginTime) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//开始时间
long beginSecond = sdf.parse(beginTime).getTime();
//结束时间
long endSecond = sdf.parse(endTime).getTime();
//花费时间
return ((float) (endSecond - beginSecond)/1000f);
}
**总结:**其实,在最开始编写代码的时候,运行效果就有点不理想,执行时间一直不显示,但是执行状态显示是正常的,又因为只是一个小小的提示语句,就没有多在意它。后面是因为将两个同步代码合二为一,只执行前面一个,后面一个不执行,才发现了这个藏得比较深的bug。所以,代码永远是不会撒谎的。另外需要注意的一点就是,如果在第二部分代码块里面不加catch (Exception e){ }的话,程序可以像之前一样执行,没有执行时间的提示,同步正常进行,那这个bug就要藏更久了,所以,还是要养成这个习惯。