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

本文通过一个具体的案例,讲述了在Java开发过程中,如何因多态特性导致空指针异常的问题,并深入分析了解决该问题的方法及调试技巧。

有时候,经常会有的人觉得基础知识有什么用?面试那么多,流于形式。无奈,一直我热衷于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远程调试(参考)。

转载于:https://my.oschina.net/u/161336/blog/313847

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值