2012-07-24 77 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

相关问题