为了账号安全,请及时绑定邮箱和手机立即绑定

“ while(true)”循环是如此糟糕吗?

“ while(true)”循环是如此糟糕吗?

偶然的你 2019-11-25 12:45:31
我已经用Java编程了几年了,但是最近我刚回到学校获得了正式学位。我很惊讶地得知,在上一次作业中,我因使用如下所示的循环而失去了分数。do{     //get some input.     //if the input meets my conditions, break;     //Otherwise ask again.} while(true)现在,对于我的测试,我只是在扫描一些控制台输入,但是有人告诉我,不鼓励这种循环,因为使用break类似于goto,我们只是不这样做。我完全了解gotoJava及其表亲的陷阱break:label,并且我有很好的理由不使用它们。我还意识到,一个更完整的程序可以提供其他一些逃生方法,例如只是结束程序,但这不是我的教授所引用的原因,所以...这有什么错do-while(true)?
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我不会说这很糟糕 -但同样地,我通常至少会寻找另一种选择。


在我写第一件事的情况下,我几乎总是至少尝试将其重构为更清晰的内容。有时它是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它更加缩进,并且,如果您想弄清楚testCondition返回时会发生什么true,您需要仔细查看块的其余部分以检查是否存在是不是经过了else可能会出现的块是否running已经被设置为false与否。


该break语句可以更清楚地传达意图,并让块的其余部分继续进行所需的操作,而不必担心较早的条件。


请注意,这与人们在一个方法中拥有多个return语句的说法完全一样。例如,如果我可以在前几行中得出方法的结果(例如,因为某些输入为空,为空或为零),那么发现直接返回该答案要比使用变量存储结果更清楚,然后是一整段其他代码,最后是一条return语句。


查看完整回答
反对 回复 2019-11-25
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

AFAIK没什么,真的。老师只是对过敏goto,因为他们听到某处情况确实很糟糕。否则,您将只写:


bool guard = true;

do

{

   getInput();

   if (something)

     guard = false;

} while (guard)

几乎是同一回事。


也许这更干净(因为所有循环信息都包含在块的顶部):


for (bool endLoop = false; !endLoop;)

{


}


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 649 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信