为什么这个循环无限?

时间:2012-12-04 05:02:15

标签: java

int MATCH_LENGTH = 0;
int FINAL_MATCH_LENGTH = 0;
int FINAL_MATCH_POS = 0;

while (window.contains(next)) {
    int MATCH_POS = window.indexOf(next);
    boolean nextMatches = true;
    while (nextMatches = true) {
        int index = window.indexOf(next);
        index++;
        int positionOfNext = fileArray.indexOf(next);
        positionOfNext++;
        MATCH_LENGTH++;
        char afterNext = fileArray.get(positionOfNext);
        char afterNextInWindow = window.get(index);
        if (afterNext != afterNextInWindow) {
            nextMatches = false;
            if (MATCH_LENGTH > FINAL_MATCH_LENGTH) {
                FINAL_MATCH_POS = MATCH_POS;
                FINAL_MATCH_LENGTH = MATCH_LENGTH;
                MATCH_LENGTH = 0;
            }
            window.remove(window.indexOf(next));
        }
    }
}

我在这里遇到了一个无限循环。我认为这是因为nextMatches布尔变量。但是,我不确定这会如何影响程序,因为while循环的条件为while (window.contains(next))。但是,我逐个删除next的出现次数,因此最终while (window.contains(next))必须返回false并且while循环必须中断。尽管使用删除行window.remove(window.indexOf(next));,我的推理可能存在缺陷。

或者我推理的其他部分有缺陷吗?

4 个答案:

答案 0 :(得分:7)

您犯了经典= vs ==错误

while (nextMatches = true) 

应该是

while(nextMatches)

作为一般规则,不要将布尔值与truefalse 进行比较。它只是导致了这些奇怪的错误,并使我认为代码不太清晰。如果你正确地命名变量,Java约定的布尔声听起来像条件​​。例如:isEmptyisFull。这样的事情就像英语:while(isFull)

我对你的逻辑感到有点困惑,特别是因为int index = window.indexof(next)不会改变任何东西。索引将被重新定义。

答案 1 :(得分:4)

问题出在while (nextMatches = true)尝试改为

while (nextMatches == true)

答案 2 :(得分:2)

while (nextMatches == true) {

如果falsenextMatches分配,则此条件为false

您分配的唯一地点false位于以下代码块中:

if (afterNext != afterNextInWindow) {
    nextMatches = false;
    ...

因为,while对您来说无限运行,这意味着代码执行时nextMatches永远不会被赋予false,即 if条件总是{{ 1}}

这意味着,在false的每次迭代中都是如此; while始终等于afterNext

答案 3 :(得分:1)

我发现了问题。就是这一行:int index = window.indexOf(next);。 我一遍又一遍地重新定义index作为相同的数字,这导致了无限循环。问题解决了!