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

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

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

我完全理解goto和它的Java兄弟break:label的陷阱,而且我很明智地不使用它们。我也意识到,一个更完整的程序会提供一些其他的逃避方式,比如结束程序,但我的教授并没有提到这一点,所以……

do-while(正确)怎么了?


当前回答

如果您的循环在后台线程上运行,这可能会很糟糕,因此当您通过终止一个UI线程来关闭应用程序时,这段代码将继续执行。正如其他人已经说过的,你应该总是使用某种支票来提供一种取消的方式。

其他回答

您可以使用一个布尔标志来指示何时结束while循环。中断和转向是软件难以维护的原因——软件危机(tm)——应该避免,也可以很容易地避免。

这是一个你是否务实的问题。实用的程序员在这种简单的情况下可能只使用break。

但是最好养成不使用它们的习惯,否则可能会在不合适的情况下使用它们,比如在复杂的嵌套循环中,代码的可读性和可维护性因使用break而变得更加困难。

我猜用break对老师来说就像折断树枝来得到果实,用一些其他的技巧(向树枝鞠躬),这样你得到了果实,而树枝仍然活着。

从某种意义上说,结构化编程构造优先于(有些非结构化的)中断和继续语句,这是不好的。相比之下,根据这一原则,他们更喜欢“去”。

我总是建议让你的代码尽可能结构化……不过,正如乔恩·斯基特指出的那样,不要让它更有条理!

我想说,一般来说,它不被认为是一个好主意的原因是你没有充分发挥这个结构的潜力。此外,我倾向于认为许多编程教师不喜欢他们的学生带着“包袱”进来。我的意思是,我认为他们喜欢成为学生编程风格的主要影响因素。也许这只是老师的一个讨厌的地方。

对我来说,问题在于可读性。

带有true条件的while语句不会告诉您任何关于循环的信息。这使得理解它的工作更加困难。

从这两个片段中更容易理解什么?

do {
  // Imagine a nice chunk of code here
} while(true);

do {
  // Imagine a nice chunk of code here
} while(price < priceAllowedForDiscount);