基础知识的困惑让BUG更隐蔽

原创
2014/09/15 18:52
阅读数 38

有时候,经常会有的人觉得基础知识有什么用?面试那么多,流于形式。无奈,一直我热衷于java基础的人,也忽略了很多细节,直至在一个bug面前,苦思冥想。

问题是由于什么引起的呢?多态。在父类继承子类的时候,发生的故事。先描述一下背景。

1. 写了一个这样的类,作用不再描述
这里写了getter/setter方法,已经OK了。

2. 在spring的配置文件中,我也遵守spring的规则配置完毕

以上,两点,大家都不需要质疑。配置完全正确。

问题是什么呢?在类中,调用merchantSalePlatRecordMapper方法的时候,出现空指针。通过代码跟踪发现这个对象为NULL。再通过跟踪代码,发现这个对象的值已经设置完毕。

迷惑在哪里?迷惑在为什么设置的值里没有了东西?

这种现象曾经出现过,主要是由于,同一个ID的Bean被同事设置两次,导致实际使用的Bean为没有赋值的Bean。他本以为是会关联上了(混淆了ref的作用)。于是,我也按照这个思路继续思考,这个时候我就陷入了一个坑里。期间,我查询了对应的Bean,在配置文件中,的确是有一份。不会重复。

后来,通过跟踪代码,我发现他的merchantSalePlatRecordMapper在一个类里有两份。而且名字不一样?我当时觉得奇怪,但是我没有仔细想(经验不足)。后来,同事告诉我,RestrictUpCreateRecordHandler有子类,子类里注入了merchantSalePlatRecordMapper。于是,我们看一下子类。

此时也存在merchantSalePlatRecordMapper的getter/setter方法。

看到这里,我想大家应该明白。同事编写的代码,由于merchantSalePlatRecordMapper是private作用域,那么在子类和父类中,分别存在一份。那么,同时又在两个类中做了get/set方法,导致了子类的merchantSalePlatRecordMapper被注入,而父类中没有执行注入。

总结:
1. 在此次调整中,对问题的细节把握不够清晰,而且陷入了经验主义,导致问题定位不准,修复时间过长。
2. 我鼓励大家多做重构,提高代码复用性,过分迷惑同事,暴露基础薄弱的缺点。
3. 在分析问题之前,应该尽可能的对问题把握清晰。相互关系梳理好,再做。避免陷入自己的泥潭。

在这里推荐一种调试方法:Tomcat远程调试(参考)。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部