老板让我展示新功能,结果系统繁忙,请稍后再试……

       首先简单介绍一下具体的业务需求场景:小王同志在某电商平台新开了一家店铺,需要给这家店铺新增一些仓库地址,由于店铺的规模很大,所以在全国各地都需要有仓库,便于商品的流转。

       ok,很简单的一个需求我们首先新建一张店铺和仓库的关联信息表,然后再创建一张仓库详细信息表。好了,这样我们的需求表格就创建好了。

       根据需求我们只需要CURD……不就ok了吗?这么简单的需求还需要我来动手。来,那个实习生来你来把这个需求实现一下,熟悉一下业务、锻炼一下动手能力……

      咳咳……不好意思,公司里的是实习生都走完了……

      只能自己动手了,然后就是一通熟悉而又无聊的操作过后,叫上前端联调一下接口,出俩页面。齐活、完事。

       说重点说重点……此时此刻页面刚出好,还没做测试。老板带着他的朋友就过来说让我们展示一下我们的系统,此时老板对我眨了眨眼睛,那意思是说:小伙子,快给我的朋友展示展示我们牛*的系统,让他开开眼界。我立马心领神会,也向老板眨了眨眼。意思是说:放心吧,老板绝对不会让你失望,保证让你的朋友大开眼界。然后……我们主管就过来展示系统了(想什么呢,这种事情怎么会让一个开发来做呢,当然是主管来了……这么好的表现机会……)。我就在一旁默默的看着(解释一下,上面说的那个需求只是我们系统中一个小的环节,是流程走下去的其中一环。)

     开始展示,主管先是为老板朋友详细讲解了一番,此处略去一万字(主要意思就是说这个系统怎么怎么的牛*怎么怎么的厉害,解放了多少的人工,减少了多少人为出错的可能,提升了多少效率之类的话……),经过主管的这一番讲解,确实让老板的朋友感叹系统的牛*,称赞不已,连番称赞之后,便迫不及待的让主管赶紧展示一番。(毕竟光说不练假把式,没真正看到都是虚的)。

我站在后面也是默默的比出大拇指,不亏是主管,光是说就已经让老板的朋友 yu ba 不能了……

       在主管的一番操作之下,老板朋友更是连番点头,嘴巴里只说:wo c,这么 d,原来还可以这么玩,操作这么简单……咳咳,然后就到了上面说的那部分需求。填入店铺相关信息、仓库地址相关信息点击完成,ok,万事大吉、没有任何问题(说实话,我站在后面还是有些紧张的,毕竟这玩意写出来还是热乎的,也没有经过测试就拿出来展示了,心里还是有些虚的。当我看到新增操作完成之后,便松了一口气,心想:哼,就这……)。主管见操作完成之后也是一番欣喜,回头看了看了,不错嘛小伙子,我立马点了点头,微微一笑表示:没什么没什么,基操勿6。

      主管见新增一个可以,然后对老板朋友说,我们的系统针对店铺可以添加多个仓库,将实际情况都全面的考虑进去了,而且可以根据收货地匹配最优的仓库进行发货,节省运费成本。说着便使用该店铺信息又新增了一个仓库,点击完成之后,页面突然出现弹窗“系统繁忙,请稍后再试^^”,我站在后面,心里一凉。完蛋,怎么会这样……主管也回头,脸色有些不好,看着我,这是怎么回事,怎搞得,快给我一个解释。此时我急中生智,连忙说:这是我们的测试版本,目前一个店铺只支持一个仓库,这是为了便于我们的算法测试。主管说:是这样吗,这个功能一定要支持多个仓库。我:好的好的,这部分功能还处于测试阶段,完全是支持多仓库的。主管点了点头,然后对老板朋友说:这部分是支持多仓库的,后续我们会更新这部分的功能的,这不妨碍后续的流程,我们继续往下走。最后系统展示终于展示结束了,站在后面的我一直替自己捏着把冷汗,看到展示结束也算是送了一口气。然后老板和朋友以及主管便到茶厅喝茶去了,而我……

       赶紧去找BUG啊。ok,因为是要添加店铺和仓库的关系,所以这之间的关系是:一个店铺可以添加多个仓库是一对多的关系,但是有一点,店铺添加的仓库信息是不能重复的,重复的仓库信息肯定是不对的。我在新增数据判断重复的时候有判断的逻辑在里面的啊,怎么会在新增第二个仓库的时候出错呢,然后我找到相应的接口,找到逻辑实现层,一看代码便发现了问题所在:

        if(null != warehouseList || !warehouseList.isEmpty()){
            // do something
        }

集合判空这样是不对的,不可以用 || 应该用 &&

为什么呢?这是因为==和!=使用的判断的是引用类型的地址,List集合的isEmpty()方法判断的是集合的内容,这里如果使用 || 来判断的话第一个条件null != warehouseList是成立的,所以导致第二次新增的时候,获取到该集合的size虽然是0但是该集合的地址是存在的,null != warehouseList判断的正是地址,所以这个if判断是成立的,使用&&则是不成立的。

这里就涉及到java的内存模型了,这里简单画了一个Java 的内存模型。

当一个集合被创建时,会在该线程的的栈中生成一个引用,也就是地址,该地址指向堆内存中的对象。

List<String> warehouseList = xxMapper.selectWarehouseByShop("aaShop", "bbWarehouse");

上面这段代码的warehouseList集合的地址在栈中是存在的,

List<String> nullList = null;

新建一个集合当它等于null时,只是在栈中创建了一个变量nullList,并没有引用指向堆内存,所以此时如果使用 == 来判断是成立的。

以上,重点就是判断集合是否为空的时候,如果是判断集合的地址的话可以使用 == ,判断集合的内存是否为空则可以使用集合的isEmpty()方法来对集合进行判断。

我一般使用这种来对集合进行判空:

null != warehouseList && !warehouseList.isEmpty()

上面的故事纯属虚构,如有雷同,实属意外,哈哈。

还有在写代码时这种低级的错误实在是不应该发生的,共勉;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值