Eclipse只是在程序执行过程中永远运行

时间:2015-01-27 22:00:57

标签: java eclipse

我观察到一种非常奇怪的行为。我很确定我的代码中存在一个错误,但Eclipse的行为非常奇怪,以至于我无法解决任何问题。

首先,这是我的代码:http://pastebin.com/JCaW53GM

我正在尝试解决Project Euler's problem 96,即我正在尝试使用Knuth的Dancing Links构建一个数独求解器。经过大量的准备,这个程序应该可以解决问题:

    private static void search(int k) {
            System.out.println("start search");
            if (masterHeader.right == masterHeader) {
                    return;
            }

            // choose column
            Column c = new Column("");
            int s = Integer.MAX_VALUE;
            for (Column j = (Column) masterHeader.right; j != masterHeader;
                            j = (Column) j.right) {
                    if (j.size < s) {
                            c = j;
                            s = j.size;
                    }
            }

            // dancing links
            c.cover();

            for (Datum r = c.bottom; r != c; r = r.bottom) {
                    o[k] = r;
                    for (Datum j = r.right; j != r; j = r.right) {
                            j.column.cover();
                    }
                    System.out.println("before calling search(" + k + " + 1)");
                    search(k + 1);
                    r = o[k];
                    c = r.column;
                    for (Datum j = r.left; j != r; j = j.left) {
                            j.uncover();
                    }
            }

            c.uncover();
    }

每当我运行程序时,我得到以下输出:

start search
before calling search(0 + 1)
start search
before calling search(1 + 1)
start search
before calling search(2 + 1)
start search
before calling search(3 + 1)
start search
before calling search(4 + 1)
start search
before calling search(5 + 1)
start search
before calling search(6 + 1)
start search
before calling search(7 + 1)
start search
before calling search(8 + 1)
start search

之后---没什么。没有错误,没有溢出,Eclipse只会继续运行。我完全不知道这意味着什么。我很确定它在搜索(9)停止的事实与我的代码中的许多9有关。但是没有错误,我不知所措。

任何人都可以开导我吗? Eclipse想要什么?我做错了什么?

编辑: Gaaah!我完全忽略了输出的最后“开始搜索”。这让我很困惑。猜猜我太累了...无论如何,对不起大家都在打扰你。是的,它显然只是一个无限循环的简单情况。我希望我能够自己调试。

1 个答案:

答案 0 :(得分:2)

r != c;是一个表达式,只有在谈论对象的完全相同的实例时才有意义。由于rc都是Datum个对象,因此除非它们是完全相同的实例,否则它不会评估为true

您可能想要做的是在.equals类上定义Datum。然后,您可以改为呼叫!r.equals(c)

您也可以对这些变量进行重命名,因为rowcolumnrc要简单明了。