我在这里遇到一个非常奇怪的bug!
我有一个大小为3的LinkedList
,当我将其与零进行比较时,它被评估为True
!
上帝为什么要这样做呢?
代码:
long depth = 0;
long initial = System.currentTimeMillis();
OthelloStateNode root = new OthelloStateNode(_state);
List<OthelloStateNode> children = root.generateChildren();
System.out.println("SIZE: " + children.size());
if (children.isEmpty()) {
return null;
}
generateChildren()函数:
public List<OthelloStateNode> generateChildren() {
// expand children, if necessary
if (children == null) {
children = new LinkedList<>();
for (OthelloMove move : state.generateMoves()) {
OthelloStateNode child = new OthelloStateNode(state.applyMoveCloning(move));
child.movement = move;
child.parent = this;
children.add(child);
}
}
return children;
}
println
的输出是&#34; SIZE:3&#34;!它没有理由True
。
显然,如果我删除System.currentTimeMillis()
它可以正常工作......但如果3等于0则不应该与问题相关,是吗?
有人对此有所了解吗? 以下是代码,如果您要下载并测试它是否也发生在您的计算机上:https://docs.google.com/file/d/0Bxl_AQ6nM3yXVnAzdXg5MFUtVTg/edit
答案 0 :(得分:3)
我认为这个问题肯定属于“灰色区域”,因为从你提供的代码片段来看,它是不可能发生的 - 链接列表肯定有效,并且没有你可以依赖它的bug。 因此,我们无法真正提供答案的最明显的原因是我们没有足够的信息。
现在,你已经说了一些“有趣”或至少是可疑的东西 - 当你删除时间测量它有效。 有时,当您运行多个线程并且一个线程以某种方式更改列表的内部状态时,可能会发生这种情况。 例如:线程A获取对在时间t1具有3个元素的List的引用。 线程B也有相同的参考。 线程B在时间t2(t2> t1)改变列表的状态,线程A不知道它只是保持引用并忙于其自己的工作。 在时间t3(t3> t2),线程A访问列表,显然它已经改变了。
这是看到这种行为的一个可能原因。
深入研究的另一个方向:)
您是否尝试在没有IDE的情况下以“旧方式”在命令行中运行此命令? 有时候(我很少承认并且很少进行远程调试)可能会发生这样的事情,因为你的源代码与调试器认为它们不同步。 这可以通过刷掉编译的类并重建所有内容来解决。 我知道这不太可能是原因,但值得一提。
希望这会有所帮助