1

我目前正在根据教科书开展一个项目,并且我在 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);
}

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

4

5 回答 5

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')
    ;

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

于 2012-07-15T14:55:22.790 回答
2

您的更改改变了代码的逻辑。的想法while(getImage().getWidth(applet) <= 0);是等到小程序宽度大小> 0。之后是其余的代码。(它可能会等待另一个进程来初始化小程序)。

于 2012-07-15T14:58:33.817 回答
1

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

这是一种糟糕的编码风格,并且 getWidth 也可以知道 getHeigth 仍未完全读取的位置。

这源于互联网连接速度较慢的 Java 的第一个时期。

更好的是使用ImageObserver回调。

于 2012-07-15T15:00:00.307 回答
0

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

如果是故意的,那么看起来这段代码可能正在等待另一个线程来更改相关小程序的宽度。这不是做类似事情的好方法。

于 2012-07-15T14:56:09.840 回答
0

这是一个无限循环。不确定是否错字,我会按照你的方式写。

我怀疑这是一个测试,看看你是否发现了错误,恭喜你做到了!

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

于 2012-07-15T14:58:20.493 回答