来源于contains方法,因为它接受object作为参数,太宽松了,以至于不小心写错后,eclipse都无法提供错误提示,而且这种错误不会有异常,运行时也不会因错误而中断,是纯粹语义上的错误,这种错误在我看来是最可怕的。
讲一下我的这个错误。
我有一个HashSet<Integer> A;用来记录那些曾经被插入队列的节点(Vertex),对于一个新来的节点,如果不在A中,就插入队列。后来我发现这个队列无限制增长,折腾很久发现原因是这样的:
while(!queue.isEmpty()){ if(A.contains(node)){ continue; } if(XXX) A.add(node.getId()); queue.add(node.getId()); } }
即插入A的是node的id,而检查时却检查了node本身,所以那个contains检查根本无效,但是eclipse不会告诉你这里有错误,警告也没有
虽然这里似乎很容易看到contains和add的不一致,但是原来这两句距离很远,使得很难发现这个bug