我们在写SSM时,需要写DAO层与数据库进行交互,然而,我们会发现,与数据库的交互,肯定会有异常出现,此时需要我们进行捕获。 所以通常而言,我们的DAO层的代码都会如下: 比如上面的例子,查询商城的订单详情,我们需要向数据库进行查询。 我们分析下上面的代码,可以发现,该方法的执行结果会有三种情况出现:
- 如果成功查询,那么会返回我们想要的数据,执行完try语句后就直接结束该方法。
- 如果成功查询,并且查询的结果刚好为空,即数据库并没有符合要求的行数据,那么该方法也会在执行完try语句后返回null,然后结束该方法。
- 如果在执行try语句块的过程中,出现了异常,由于我们进行了try-catch,所以会跳转到catch处理掉异常,然后往下执行,所以接下来,会执行的是return null;也就是说,会返回null并结束该方法。
所以分析完这可能出现的三种情况,你们有没有发现问题的所在? 问题:如果我们采用这种编码方式,会导致外界调用该方法的调用者对返回的结果的意义不明确,即返回null时,外界的调用者不确定是因为程序执行出现异常才返回null,还是因为数据库压根就没有所要查询的数据,所以才返回null。因此,返回null的情况产生了歧义,意义不明确,不符合我们的程序运行规范(每个结果要有明确的意义)。
那么,要如何避免呢?很简单,耍个小心机就可以了! 在捕获完异常并处理后,添加划线的代码即可。 因为throw的是运行时异常,所以外界的调用者可以不对其进行处理。 通过我们这么一改造,那么该方法的运行结果就会出现如下三种情况:
- 如果成功查询,那么会返回我们想要的数据,执行完try语句后就直接结束该方法。
- 如果成功查询,并且查询的结果刚好为空,即数据库并没有符合要求的行数据,那么该方法也会在执行完try语句后返回null,然后结束该方法。
- 如果在执行try语句块的过程中,出现了异常,由于我们进行了try-catch,所以会跳转到catch处理掉异常,并且处理完异常后,又重新抛出一个运行时异常,最后结束该方法。
如此一来,我们就可以完美避开方法返回null时的意义存在歧义的现象啦!
好了,如果这篇文章对你有帮助的话,不妨点个关注吧~ 期待下次我们共同讨论,一起进步~
|