Java 使用.getWidth()时找不到nullpointer的原因
我很难找到在这段代码上返回空指针的原因:Java 使用.getWidth()时找不到nullpointer的原因,java,nullpointerexception,null-pointer,Java,Nullpointerexception,Null Pointer,我很难找到在这段代码上返回空指针的原因: import java.awt.Graphics2D; import java.awt.Rectangle; public class Move { private static final int DIAMETER = 30; int x = 0; int y = 0; int x_1 = 1; int y_1 = 1; private GameStart game; public void Ball(GameS
import java.awt.Graphics2D;
import java.awt.Rectangle;
public class Move {
private static final int DIAMETER = 30;
int x = 0;
int y = 0;
int x_1 = 1;
int y_1 = 1;
private GameStart game;
public void Ball(GameStart game) {
this.game = game;
}
void moveBall() {
if (x + x_1 < 0) {
x_1 = 1;
}
if (x + x_1 > game.getWidth() - DIAMETER) {
x_1 = -1;
}
if (y + y_1 < 0) {
y_1 = 1;
}
if (y + y_1 > game.getHeight() - DIAMETER) {
game.gameOver();
}
if (collision()) {
y_1 = -1;
y = game.racquet.getTopY() - DIAMETER;
}
x = x + x_1;
y = y + y_1;
}
private boolean collision() {
return game.racquet.getBounds().intersects(getBounds());
}
public void paint(Graphics2D g) {
g.fillOval(x, y, 30, 30);
}
public Rectangle getBounds() {
return new Rectangle(x, y, DIAMETER, DIAMETER);
}
}
如果(x+x_1>game.getWidth()-DIAMETER){,我在行上得到一个空指针
在另一个类中以samme方式运行,效果很好-但由于某些原因,它在这个类中无法运行。我尝试打印结果,但这只是另一个空指针。我知道我缺少一些内容,但无法找到它。您没有呼叫
public void Ball(GameStart game) {
this.game = game;
}
这就是为什么在你的
Move
类中,GameStart
仍然为空。你还没有将Move
类型的实例Move\u ball
的成员变量game
设置为一个值,因此它是null
,并因此抛出一个NullPointerException
您需要实例化此成员变量,例如通过调用move\u ball.ball()
另外,请不要让非构造函数的方法以大写开头,请始终使用camelCase,而不是在名称格式之间切换。这会使您的代码很难阅读。似乎您需要这种方法
public void Ball(GameStart game) { this.game = game; }
要真正成为一名构造函数:
public Move(GameStart game) { this.game = game; }
然后,在实例化移动时,必须使用此构造函数(因为不再有arg构造函数):
Move move_ball = new Move(this);
您不能通过Ball
方法将GameStart
传递给Move
。这是一个非常容易引起误解的名称。它应该是setGame
或其他东西。您应该为Move类创建一个构造函数,将游戏作为参数,并将该参数存储在类中的一个变量中
例如:
Public Move(GameStart mygame){
game = mygame;
}
这应该允许您使用创建移动的游戏方法。它将基本上取代您使用的“球”方法。我刚刚尝试删除This.game=game
,作为另一个NPE建议的帖子,但没有运气。使用This.game.getWidth()
也返回NPE。或者我误解了你吗?你为什么有这种方法?什么是Ball
?这是复制粘贴的错别字吗?我认为SeelenVirtuse的直觉是正确的。我不是直接复制粘贴-但下面是:我可以看出我没有调用Ball构造函数。这应该是问题所在吧?谢谢你指点我正确的方向,而不仅仅是粘贴一个工作示例!干杯!很高兴帮助愿意学习而不仅仅是复制代码的人:)
Public Move(GameStart mygame){
game = mygame;
}