Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用.getWidth()时找不到nullpointer的原因_Java_Nullpointerexception_Null Pointer - Fatal编程技术网

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;
}