我目前正在从一本教科书中开展一个项目,而且我遇到了一个带有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);
}
有人可以解释两者之间的区别吗?我把我的代码更改为第一个,我的程序运行得很好,但我不明白其中的区别。
答案 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