小编典典

“while(true)”循环这么糟糕吗?

all

我已经用 Java 编程好几年了,但我最近才回到学校获得正式学位。我很惊讶地发现,在我的上一个作业中,我因为使用​​下面这样的循环而丢了分。

do{
     //get some input.
     //if the input meets my conditions, break;
     //Otherwise ask again.
} while(true)

现在对于我的测试,我只是在扫描一些控制台输入,但有人告诉我不鼓励这种循环,因为 usingbreak类似于goto,我们只是不这样做。

我完全理解goto及其 Java
表亲的陷阱break:label,并且我有很好的理由不使用它们。我也意识到一个更完整的程序会提供一些其他的逃避方式,比如结束程序,但这不是我的教授引用的原因,所以......

有什么问题do-while(true)


阅读 81

收藏
2022-06-10

共1个答案

小编典典

我不会说这很 糟糕 ——但同样,我通常至少会寻找替代方案。

在我写的第一件事的情况下,我几乎总是至少 尝试
将它重构为更清晰的东西。有时它无济于事(或者替代方法是有一个bool变量,它除了指示循环结束之外没有任何意义,不如break语句清晰),但至少值得尝试。

break作为一个比标志更容易使用的例子,请考虑:

while (true)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        break;
    }
    actOnInput(input);
}

现在让我们强制它使用一个标志:

boolean running = true;
while (running)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        running = false;
    }
    else
    {
        actOnInput(input);
    }
}

我认为后者读起来更复杂:它有一个额外的else块,actOnInput缩进更多,如果你想弄清楚 return
时会发生什么testConditiontrue你需要仔细查看块的其余部分以检查那里不是块 之后
的东西,else无论是否running设置为false

break语句更清楚地传达了意图,并让块的其余部分继续它需要做的事情,而不必担心早期的条件。

请注意,这与人们对方法中的多个 return
语句的论点完全相同。例如,如果我可以在前几行中计算出方法的结果(例如,因为某些输入为空、空或零),我发现直接返回该答案比使用变量来存储结果更清晰,然后是一整块其他代码,
最后 是一条return语句。

2022-06-10