解决bug总结:
1:首先确认这是不是一个bug,可能是因为运行环境导致出现该现象;可能是因为某种依赖的服务未开启导致,例如报502,503等错误;redis连接超时。对于和数据库数据相关的bug,例如数据不显示。先用查询语句,使用这个bug的相同的条件查询相关表,看是否存在数据。
2:确认bug的确存在,开始调试。可以使用接口调试工具对接口直接调试,通过打日志的方式或者本地debug查看信息。
3:常见的错误:
1.空指针异常。这种错误一般是在使用某个字段时未作判空处理。尤其是在从某个对象中取字段,而该对象是空,从而报空指针异常,在对象相关的 get,set方法处仔细检查,快速定位。特别提醒:在打日志时更需要注意空指针,如log.info(a.toString()),此时如果a对象为空,就会报空,而如果没有try/catch时,很难定位错误;容易误导是正常逻辑代码出现错误。
2.在循环中,使用List。伪代码如下:
Object a = new Object ();
List<Object> list = new ArrayList<>();
for(int i = 0 ; i< 10 ; i++){
a.setX(i);
list.add(a);
}
最终输出list 中的每个对象,可能会出现 后 几个对象的X 值完成相同(最后一个对象的值9)。
对于在循环中,往list 中添加对象。list发现对象 用和之前元素一样(a的引用一直没变),就覆盖掉了之前add的对象。所以循 环之后list中的对象是重复的对象。
解决方案:
Object a ;//声明对象
List<Object> list = new ArrayList<>();
for(int i = 0 ; i< 10 ; i++){
a = new Object(); // 实例化对象
a.setX(i);
list.add(a);
}
3.在try/catch块中,可以将异常信息打印,方便调试。如:log.error(e.getMessage())。有时候可以为了调试增加try/catch 捕捉异常。调试完后,可以去除try/catch。
4.
if( !returnMsg.equals("")){
errorMsg = returnMsg;
authBo.setMessage(YaDouParaCommom.ROOM_IDCARD_AUTH_FAILED_MSG);
authBo.setValidateError(errorMsg);
return false;
}
重点关注 if条件里面的表达式。 returnMsg.equals("") 和 "".equals(returnMsg)在某种情况下是不一样的。如果 returnMsg的值为null , 那么 returnMsg.equals("")会报 null 异常。而"".equals(returnMsg)则不会。这个bug是在和别人系统对接时,别人的接口返回回来的returnMsg字段。 然而,接口文档里面,返回信息对应的字段是returnMsg ,而真实返回信息对应的字段是msg。导致json封装对象时该returnMsg字段的值为null。
在与其他系统后调用别人写的接口时,最好在调用后立即打印(在转为java对象前)真实返回值,一般是json字符串。观察返回值与封装对象的属性是否 相对应。
后续仍会继续更新!