零售退款导出列表页下载出错

线上报零售退款导出报表下载出错。

第一次,线上报紧急问题,我心中竟然波澜不惊。也许是事先我已经足够审慎地审查过每一行代码的风险(改动也比较大,但绝大部分都是新增的),尽可能避免有风险的做法,并回归了所有必要的导出场景(只差一点,我不记得为什么正好就那个场景没有回归到或者没有发现问题)。甚至测试同学回滚后恢复正常,我依然固执认为不是我代码引起的问题。

但最终还是栽在一个极不起眼的小细节上。事出必有因。看下面的代码,你能猜到什么原因吗 ?

因为退款导出还未接入云存储,newUrlMap 为空,List newSubUrls = StreamUtil.map(subUrls, url -> newUrlMap.get(url)); 会将 null 值填入 newSubUrls ,join 之后,newUrl 就会变成 "null" 字符串,导致退款下载 url 被设置为 null,下载就出错了。

启示:

  1. 不要惧怕故障。要避免故障,唯一的方法是足够审慎地审查每一行代码可能的风险,做好足够的测试回归。没有人能避免出错,但有章法的做事可以将影响面降低到最小;恐慌是完全没有必要也没什么用处的;

  2. 细节上最易出错。往往改动很大,主要部分因为非常小心不会出错,一些不起眼的地方却会遭致失败。不可不鉴之。

  3. 使用 stream.map 时,要防御 null 值写进最终的值集合。写成这样: List<String> newSubUrls = subUrls.stream().map(url -> newUrlMap.get(url)).filter(Objects::nonNull).collect(Collectors.toList());

posted @ 2020-07-15 20:42  琴水玉  阅读(156)  评论(0编辑  收藏  举报