0

我目前正在阅读 Eric Robert 的Art and Science of 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);
    }
}

}

非常感谢!

4

1 回答 1

1

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

这是正在发生的事情。

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

setup()中,您创建一个名为 的 GOval变量ball。这与您在全球范围内创建的不同。这个名为的新变量ball是一个局部变量,并且只存在于setup()方法中。它全局变量不同ball。因此,play()当您尝试移动时ball,您是在尝试移动全局变量ball这与您在其中创建的局部变量不同setup()。事实上,全局变量ball从未实例化(从未创建,或为空),因此您实际上无法对其进行操作。这就是您收到空指针错误的原因。

要修复您的代码,您需要确保将全局变量分配给新球,而不是局部变量。它很容易修复,您只需要删除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);
    }
}
}

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

于 2012-07-25T12:54:01.390 回答