2012-07-24 66 views
0

我目前正在通過Eric Robert的藝術與科學Java,它使用ACM Java庫。其中一個練習是讓學生建立一個Breakout的克隆。我對物體的動畫有問題,所以請看看這個代碼,如果可能的話告訴我爲什麼球沒有移動。Java/ACM:爲什麼我的對象不移動?

這是我編寫的代碼示例,旨在隔離那些給我帶來麻煩的行爲,但花了整整一個晚上之後,我想我最好尋求幫助,因爲我沒有取得任何進展。代碼應該實現的僅僅是移動對象。 (注意:這不是一個作業問題。)我在setup()中設置了球的畫布,並打算讓球在play()中移動,但沒有任何反應。

的代碼也被粘貼到:http://pastebin.com/vy3rMrZw

package codeSamples_II; 

import acm.program.*; 
import acm.graphics.*; 


public class PlayBall extends GraphicsProgram { 

private static final int DELAY = 50; 
private GOval ball; 
private static final int BALL_RADIUS = 10; 

public void run() { 
    setup(); 
    play(); 
} 

private void setup() { 
    GOval ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2); 
    ball.setFilled(true); 
    add(ball); 
} 

public void play() { 
    while (ball.getY() < 200) { 
     ball.move(5, 5); 
     pause(DELAY); 
    } 
} 

}

非常感謝!

回答

1

哦,呃!我不敢相信我第一次沒有看到這個......

這是發生了什麼事。

當您的PlayBall類在實例化時,您的定義爲 private GOval ball。這會向GOval對象創建一個空指針(一個沒有值的變量)。

setup()中,您將創建一個新的GOval變量ball。 這是一個不同於您在全球創建的那個。這個新變量ball是局部變量 ,只存在於setup()方法中。它是不是與全球 變量ball相同。所以在play()當您嘗試與移動ball,你想移動的全球 變量ball這是不一樣的,你在setup()創建的局部變量。實際上, 全局變量ball從未實例化過(從未創建或爲空),因此您實際上不能在其上運行 。這就是你得到空指針錯誤的原因。

要修復您的代碼,您需要確保將全局變量分配給新的球,而不是局部變量 。很容易修復,您只需在ball = new Goval(...)之前刪除GOval標識 即可。您的代碼看起來就像這樣:

package codeSamples_II; 

import acm.program.*; 
import acm.graphics.*; 


public class PlayBall extends GraphicsProgram { 

private static final int DELAY = 50; 
private GOval ball; 
private static final int BALL_RADIUS = 10; 

public void run() { 
    setup(); 
    play(); 
} 

private void setup() { 
    ball = new GOval(0,0, BALL_RADIUS*2, BALL_RADIUS*2); 
    ball.setFilled(true); 
    add(ball); 
} 

public void play() { 
    while (ball.getY() < 200) { 
     ball.move(5, 5); 
     pause(DELAY); 
    } 
} 
} 

您可能需要閱讀了關於變量範圍得到這是怎麼回事,如果你還有不明白的一個更好的主意。

+0

非常感謝你!突然之間,這一切都是有道理的。 – coltonpagefault 2012-07-25 16:52:50

+0

很高興能幫到你! – dykeag 2012-07-25 19:26:45

相關問題