面试官:这是我们上午刚分析的一个线上bug
,正好拿出来帮忙看看有啥问题:
if (response != null && response.isPresent() && response.isPresent().get().getResult() != null) {
ResultType resultType = response.isPresent().get().getResult();
resultType.getResultList().stream()
.map(p -> matchChildResult(p) && p.getCode == CODE_404)
.findFirst().ifPresent(result -> {
logger.build("childdata", "fail:).info();
if (ConfigFunc.getBoolean("childIntercept", false)) {
throw new ResultException("fail);
}
});
}
这段代码短时间内能看出很多问题,代码也很长,不认真看,可能回答的不是面试关想要的!
先说说第一反应吧:肯定存在NPE
问题,但这个人感觉应该不是面试官要的所以Pass
。
仔细看代码,发现如果这段逻辑自己写的话,应该将map
更换为filter
,所以将这个想法说了出来,这个也是这段代码的问题。
面试官说: 是的,但是还有个问题,你说的是代码错误,还有个设计错误。
那就是map
这里有问题:从这里入手,看看如果使用map
他们线上会导致什么问题呢?在分析之后发现:
如果使用map
这段代码会返回一个List<boolean>
的列表,应该不是开发者想要的。而且,只要respose
返回了结果,那么map
就会返回一个List<boolean>
列表,这个列表可能为:[true,false,......]
等等,开发者应该要的是满足条件才抛出错误的,但是生产应该是只要respose
返回了结果code
无论是不是404
都会抛错。导致线上系统异常,订单下跌。
面试官: 对的,就是刚想到了,拿出来分享下,分析的不错。
官网让写个遇到的
bug
,突然想到了这个面试,拿出来分享下。