2012-07-15 95 views
1

我目前正在從一本教科書中編寫一個項目,並且在while循環中出現了一個模糊的問題。教材中的代碼如下:Java - Alternate 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); 
} 

有人能解釋一下兩者的區別嗎?我將我的代碼更改爲第一個,我的程序運行良好,但我不明白區別。

回答

2

你的變化已經改變了代碼的邏輯。 while(getImage().getWidth(applet) <= 0);的想法是等待,直到小程序寬度大小變得> 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') 
    ; 

由於讀取這樣的可能混淆代碼,典型的是放置在分號單獨的行,縮進爲循環語句。

0

分號是第一個例子中while循環的結尾。有這樣的單線循環有時很有用,但這也是一個常見的錯誤。

如果是故意的,那麼它看起來也許這個代碼正在等待另一個線程來改變有問題的小程序的寬度。這不是做這種事的好方法。

0

這是一個無限循環。不知道是否有錯字,我會以同樣的方式寫出。

我懷疑這是一個測試,看看你是否抓住了錯誤,你這樣做是恭喜!

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

+0

像Mike F.說,它可能會阻止,直到發生某些事件,但如果在教科書中,它可能會被設計爲阻止你,看看你是否抓住它並像你一樣糾正。這裏有一篇關於雅的文章:http://users.csc.calpoly.edu/~jdalbey/SWE/JavaPitfalls.html – 2012-07-15 14:59:28

1

這是故意的; 圖像在後臺進程中異步加載getWidth(ImageObserver)實際上會詢問圖像是否已經可以給出寬度。這只是一個所謂的繁忙循環。第一個getWidth是-1。

這是不好的編碼風格,getWidth也可以在getHeigth尚未完全讀取的情況下知道。

這源於Java的第一個階段,因爲互聯網連接速度很慢。

更好的是使用ImageObserver回調。