gpt4 book ai didi

Java/ACM : Why doesn't my object move?

转载 作者:行者123 更新时间:2023-12-01 15:15:41 25 4
gpt4 key购买 nike

我目前正在阅读 Eric Robert 的Java 艺术与科学,其中使用了 ACM Java 库。其中一项练习要求学生构建 Breakout 的克隆版本。我对对象的动画有疑问,所以请看一下这段代码,如果可能的话请告诉我为什么球不移动。

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

我在 setup() 中设置了带有球的 Canvas ,并打算在 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 类实例化时,你的定义私有(private)GOval球。这将创建一个指向 GOval 对象的空指针(没有值的变量)。

setup()中,您创建一个名为ballGOval变量。这个与您在全局范围内创建的那个不同。这个名为 ball 的新变量是局部变量,仅存在于 setup() 方法中。它与全局相同变量。因此,在 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);
}
}
}

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

关于Java/ACM : Why doesn't my object move?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com