Java / ACM:为什么我的对象不移动?



我目前正在学习Eric Robert的《Java艺术与科学》,该书使用ACM Java库。其中一个练习让学生制作一个Breakout的复制品。我对对象的动画有问题,所以请看一下这段代码,如果可能的话,告诉我球为什么不动。

这是我写的代码示例,用来隔离给我带来麻烦的行为,但在花了整个晚上的时间之后,我想我最好寻求帮助,因为我根本没有取得任何进展。代码应该实现的仅仅是移动对象。(注意:这不是家庭作业问题。)

我在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);
    }
}

}

非常感谢!

哦,天哪!我不敢相信我第一次没看到这个。。。

以下是正在发生的事情。

当您的PlayBall类实例化时,您的定义CCD_ 1。这会创建一个指向GOval对象的空指针(一个没有值的变量)。

setup()中,创建一个名为ballGOval变量。这一个与您在全局范围内创建的不同。这个名为ball的新变量是局部变量,并且仅存在于setup()方法中。它与全局变量CCD_ 7。因此,在play()中,当您尝试移动ball时,您正在尝试移动全局变量private GOval ball0,与您在setup()中创建的本地变量不同。事实上全局变量ball从未被实例化(从未创建或为null),因此实际上不能对它进行操作。这就是为什么你会得到空指针错误。

要修复代码,需要确保全局变量被分配给新球,而不是局部变量。它很容易修复,只需要删除GOval标识符在CCD_ 14之前。您的代码将如下所示:

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

如果您仍然不理解,您可能需要阅读变量范围,以更好地了解正在发生的事情。

相关内容

  • 没有找到相关文章

最新更新