- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在阅读 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()
中,您创建一个名为ball
的新GOval
变量。这个与您在全局范围内创建的那个不同。这个名为 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/
我是一名优秀的程序员,十分优秀!