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

时间:2012-07-24 20:05:15

标签: java breakout acm-java-libraries

我目前正在阅读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);
    }
}

}

非常感谢!

1 个答案:

答案 0 :(得分:1)

哦,呃!我不敢相信我第一次没有看到这个......

以下是发生的事情。

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

setup()中,您可以创建名为GOval ball变量。 这个与您在全球创建的不同。这个名为ball的新变量是 局部变量,仅存在于setup()方法中。 与全局相同 变量ball。因此,在play()尝试移动ball时,您正试图移动全局 变量ball与您在setup() 中创建的局部变量不同。事实上, 全局变量ball从未实例化(从未创建,或为null),因此您实际上无法实现  对它进行操作。这就是你得到空指针错误的原因。

要修复代码,您需要确保将全局变量分配给新球, 不是局部变量。它很容易修复,您只需要删除GOval标识符即可 在ball = new 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);
    }
}
}

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