一. 前言
每一个程序猿在曲迂奋进的成神路上,都会遇到一些大大小小的妖魔和臭虫阻碍,可以说这些bug会伴随着我们整个的职业生涯。想当年小编也是经历了无数次的痛苦挠头,数不清的排错与实验,丢掉了不知道多少根头发,最后才以”半秃之身“成就了今天的自己。所谓"不经风雨,怎能见彩虹!不见bug,怎能成神",正是如此。
今天小编就用自己十几年的功力,来教大家如何解决我们开发路上遇到的常见bug。
遇见bug,淡定莫慌!小编告诉你,心平气和地对待bug,去分析,去排错!
二. NullPointerException异常
为了更好的教会大家如何解决异常,今天小编就用一个Java开发时最常见的空指针异常来进行演示,我们一起来看看NPE异常的解决过程。如下图所示:
在这里给大家准备了一个经典的NPE空指针异常。当出现上面问题的时候,有很多小白都会不知所措,遇到问题完全没有头绪,抓耳挠腮的就是不知道如何下手解决。也有一些稍微表现好点的同学,会在第一时间进行百度,或者是问老师,问其他同学,最后会知道自己遇到了大名鼎鼎的空指针异常,但至于为什么出现这个异常,则又完全没有了头绪。小编作为一个过来人,对小白的这些表现其实是感同身受的。
今天就那么以NPE为例,带着大家层层分析,一点点教会你如何解决异常。
三. 异常分析
1.NullPointerException
首先我们要搞清楚,自己遇到的异常到底是什么?就比如我们今天所说的空指针,到底是怎么回事呢?
java.lang.NullPointerException:空指针异常,是指我们在代码中调用某个类对象时,结果在代码执行期间JVM虚拟机发现该对象没有赋值,即值为null,此时就会出现NullPointerException异常。
2.一个案例
我们可以来看看给大家设计的下面这个案例。
2.1 测试接口
在下面的代码中,我们会通过JDBC的方式,将数据库表中的所有员工信息查询并封装到List集合中,并使用单元测试来测试接口功能。代码如下:
2.2 查询功能
上面的代码执行之后,我们会在控制台的异常信息中发现,在第29行码"com.qf.test.TestEmployee.testFindAllEmp(TestEmployee.java:29)"中出现了空指针问题。如果我们仔细观察,会发现第29行代码,又在调用第42行代码:"com.qf.dao.impl.EmpDaoImpl.findAllEmp(EmpDaoImpl.java:42)"。我们继续阅读第42行代码,如下图所示:
该方法的逻辑是要将查询到的多条记录都封装到List集合中,而List集合里添加的是员工对象,我们上面代码的错误提示的就是出现在这个方法中的第42行。而42行刚好就是我们从数据库中得到每一行每一列的字段信息。
细心的同学会看到,我们上面的Emp emp = null ; 这里只是声明了Emp对象,但并没new。我们每循环一次就表示会封装一个员工信息到集合中,但却没有给emp对象赋值,所以此时emp对象就是null。
这样经过层层摸排,我们就知道了产生空指针的真正原因所在,是因为我们没有给某个对象赋值!那么该问题怎么解决呢?
四. 解决办法
通过上面的代码分析,我们发现出现NullPointerException异常的原因,是因为我们在接口实现类中没有给Emp对象赋值,导致emp对象为null。当我们使用null去调用对应的方法来封装数据时,就会出现空指针异常。其实空指针异常解决起来也比较简单,我们只需要在第42行代码前面加入如下操作:
上面的代码,我们只是增加了给emp对象赋值的过程!这样就解决了空指针异常。
五. 总结与反思
很多初学者在刚开始学习时,有时候一个变量定义错了,或者是为了给变量赋值,都可能会引发一系列错误。一旦出现错误,很多初学者往往要花费几十分钟甚至几个小时的时间去排查故障,甚至还有一些同学最后也搞不定这些错误,严重地挫伤了学习的积极性。
其实初学者遇到的绝大多数问题,都是因为粗心大意造成的。我们以后在写代码时,不要去求快,而是要求稳,每一行代码都要认真思考琢磨,用心去打磨自己的项目,这正应了我们的一句老话:”磨刀不误砍柴工“。
今天的NullPointerException异常解决过程,给了我们初学者一个警醒,写完业务代码后,一定要再梳理一遍业务流程,尽量要做到以下几点:
编写业务方法之后,根据业务需求自己再梳理一遍业务的实现过程;
如果出现了问题,可以打断点一步步往下调试,并结合简单的输出语句验证输出结果;
只要你能够按照小编的流程走,你会发现原来bug也没有那么可怕。现在你知道异常该怎么解决了吗?