Java - Alternate While循环声明

时间:2012-07-15 14:53:05

标签: java loops while-loop

我目前正在从一本教科书中开展一个项目,而且我遇到了一个带有while循环的模糊问题。教科书中的代码如下;

while(getImage().getWidth(applet) <= 0);
double x = applet.getSize().width/2 - width()/2;
double y = applet.getSize().height/2 - height()/2;
at = AffineTransform.getTranslateInstance(x, y);

我从未见过在结尾处用分号声明的while循环,所以我将我的代码解释为标准;

while(getImage().getWidth(applet) <= 0) {
    double x = applet.getSize().width/2 - width()/2;
    double y = applet.getSize().height/2 - height()/2;
    at = AffineTransform.getTranslateInstance(x, y);
}

有人可以解释两者之间的区别吗?我把我的代码更改为第一个,我的程序运行得很好,但我不明白其中的区别。

5 个答案:

答案 0 :(得分:4)

分号是一个空语句。在评估while循环的延续条件时,您可以使用它来产生副作用:循环将产生一系列副作用,在完成时使循环条件无效,或者永久运行。

例如,如果getImage()每次调用时都会为您提供一个新图像,则循环将继续,直到返回的图像的宽度为<= 0

以下是使用while循环查找字符串中a之后的第一个字符的简单示例:

int pos = 0;
String s = "quick brown fox jumps over the lazy dog";
while (i != s.length() && s.charAt(i++) != 'a')
    ;

由于读取这样的代码可能会令人困惑,因此通常将分号放在单独的行上,缩进为循环语句。

答案 1 :(得分:2)

您的更改改变了代码的逻辑。 while(getImage().getWidth(applet) <= 0);的想法是等到applet宽度大小达到&gt; 0。之后,其余的代码继续进行。 (它可能会等待另一个进程来启动applet)。

答案 2 :(得分:1)

故意; 图像在后台进程中异步加载,而getWidth(ImageObserver)实际上会询问图片是否已经给出宽度。这只是一个所谓的繁忙循环。第一个getWidth是-1。

这是错误的编码风格,并且getWeigth仍未完全读取的地方也可以知道getWidth。

这源于互联网连接缓慢的第一期java。

最好使用ImageObserver回调。

答案 3 :(得分:0)

分号是第一个示例中while循环的结尾。像这样的单线循环有时很有用,但这也是一个常见的错误。

如果它是故意的,那么看起来这个代码可能正在等待另一个线程来改变有问题的applet的宽度。这不是一个很好的方式来做这样的事情。

答案 4 :(得分:0)

这是一个无限循环。不确定是否拼写错误,我写的方式与你一样。

我怀疑这是一个测试,看看你是否抓住了这个错误并且你这样做了恭喜!

参见:http://users.csc.calpoly.edu/~jdalbey/SWE/JavaPitfalls.html