java程序中if语句偏差时出错

时间:2013-12-02 04:55:19

标签: java runtime-error

我在这里遇到一个非常奇怪的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

screenshot

1 个答案:

答案 0 :(得分:3)

我认为这个问题肯定属于“灰色区域”,因为从你提供的代码片段来看,它是不可能发生的 - 链接列表肯定有效,并且没有你可以依赖它的bug。 因此,我们无法真正提供答案的最明显的原因是我们没有足够的信息。

现在,你已经说了一些“有趣”或至少是可疑的东西 - 当你删除时间测量它有效。 有时,当您运行多个线程并且一个线程以某种方式更改列表的内部状态时,可能会发生这种情况。 例如:线程A获取对在时间t1具有3个元素的List的引用。 线程B也有相同的参考。 线程B在时间t2(t2> t1)改变列表的状态,线程A不知道它只是保持引用并忙于其自己的工作。 在时间t3(t3> t2),线程A访问列表,显然它已经改变了。

这是看到这种行为的一个可能原因。

深入研究的另一个方向:)

您是否尝试在没有IDE的情况下以“旧方式”在命令行中运行此命令? 有时候(我很少承认并且很少进行远程调试)可能会发生这样的事情,因为你的源代码与调试器认为它们不同步。 这可以通过刷掉编译的类并重建所有内容来解决。 我知道这不太可能是原因,但值得一提。

希望这会有所帮助