最近在工作中交接到了新业务,在调试程序的过程中发现了很多BUG,这里记录一下其中一个比较离谱好玩儿的。
相同代码逻辑的伪代码,实际逻辑要复杂很多:
//符合条件的结果集
final ArrayList<Integer> integers = new ArrayList<>();
//需筛选的集合,这里的集合其实是可变的,这里随便初始化了一个,他也可能全部为2
final int[] ints = {1, 2, 1, 2, 1, 2};
Integer integer = null;
for (int i : ints){
integer = i;
//符合条件则加入结果集
if (integer == 1){
integers.add(i);
}
}
//判断符合条件的结果是否为空(就算需筛选集合全部为2,这里也不可能为空)
if (integer == null){
//当结果为空时的后续处理逻辑
}
ok,其实也不用怎么看伪代码,其实就是将符合条件的元素放入一个结果集合中而已,但是问题出现在每次都会用一个变量来接收待判断的元素,而最后直接用这个接收元素的变量来判断是否有符合条件的元素了。
第一次看到的时候,我直接???
跟同事谈起这部分代码的时候,我也是很无奈,他相当于什么呢,举个栗子!
有一家工厂,里面有一名工人负责检查工件是否损坏,每检查一个,都要把工件拿在手里,检查完后,如果是损坏的,则放入旁边的“损坏工件篮”中。
在完成了全部的检查工作后,OK,这时候要看本次检查是否有损坏的工件了,聪明的小伙伴们是不是觉得应该看一眼损坏工件篮中是否有工件呢?但是他不,他就要看看自己手里有没有拿着,我焯,他这手里肯定啥时候都拿着一个呀,检查完之后手里一定拿着最后一个,所以说这个判断逻辑是永远不可能为空的…
这个代码还离谱的运行了很久,结果也是因为几个BUG一直有偏差…
真是又好气又好笑呢…