Java 带有Graphics2D Translate的NullPointerException
我解决这个问题没有任何问题。我正在创建一个游戏,我构建了一个摄像头来跟踪玩家移动,但是当我使用Graphics2D类的translate方法时,我得到了一个空指针 这个问题并非总是发生,有时当我运行游戏时会出现错误 所有对象都是为Gr创建的Java 带有Graphics2D Translate的NullPointerException,java,nullpointerexception,graphics2d,Java,Nullpointerexception,Graphics2d,我解决这个问题没有任何问题。我正在创建一个游戏,我构建了一个摄像头来跟踪玩家移动,但是当我使用Graphics2D类的translate方法时,我得到了一个空指针 这个问题并非总是发生,有时当我运行游戏时会出现错误 所有对象都是为Gr创建的 Exception in thread "Thread-3" java.lang.NullPointerException at game.Game.render(Game.java:172) at game.Game.run(Game.java:126)
Exception in thread "Thread-3" java.lang.NullPointerException
at game.Game.render(Game.java:172)
at game.Game.run(Game.java:126)
at java.lang.Thread.run(Thread.java:745)
它指向这条线
g2d.translate(cam.getX(), cam.getY());
在我的渲染方法中
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);
g2d.translate(cam.getX(), cam.getY());
handler.render(g);
g2d.translate(-cam.getX(), -cam.getY());
if (gameState == STATE.GAME) {
hud.render(g);
} else if (gameState == STATE.MENU || gameState == STATE.HELP || gameState == STATE.END) {
menu.render(g);
}
g.dispose();
bs.show();
}
有什么想法吗
cam
来自此代码:
public Game() {
tex = new Texture();
handler = new Handler();
hud = new HUD();
menu = new Menu(this, handler, hud);
this.addKeyListener(new KeyInput(handler));
this.addMouseListener(menu);
new Window(WIDTH, HEIGHT, "Let's Build A Game", this);
spawner = new Spawn(handler, hud);
// loader = new BufferedImageLoader();
// background = loader.loadImage("/level.png");
//
// loadImageLevel(background);
cam = new Camera(0, 0);
if (gameState == STATE.MENU) {
handler.createMenuParticle();
} else {
handler.clearEnemies();
}
}
这是我使用的相机类
public class Camera {
private float x, y;
public Camera(float x, float y) {
this.x = x;
this.y = y;
}
public void tick(GameObject player) {
x = -player.getX() + (Game.WIDTH / 2);
y = -player.getY() + (Game.HEIGHT / 2);
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
由于stacktrace没有深入到任何深度,因此可能导致异常的原因只能是
g2d
和cam
。由于您以前使用过g2d
(如g
)并且它工作正常,因此问题一定是cam
,此时很可能是null
编辑:从您的编辑中,我可以看到,cam
在您展示给我们的类的构造函数中正确初始化。因此,可能会发生以下情况之一:
cam
cam
之前,将调用render
方法。尝试将cam
初始化设置为构造函数的第一行,以检查这一点。最好不要在你的游戏构造函数中启动GUI
您应该寻找能够完成这三件事之一的代码。在相关行设置断点以检查是否执行断点以及何时执行断点。
cam
在该点必须为null
。它是从哪里来的?我将在上面发布。这不是它的副本。我知道空指针是什么。我只是不知道为什么当我将坐标设置为0时cam会为空,0.render
方法属于哪个类?或者在构造函数完成之前以某种方式调用了render方法…谢谢,是的,我将cam放在构造函数的更高位置,并且没有收到任何错误。我还将cam放置在构造器外部的一个字段中,这也起作用。如果我将cam放置在游戏构造函数或字段中有什么区别?@7Winds:将其放置在成员声明中将在调用自定义构造函数代码之前调用其初始化代码。这与将其放在所有构造函数的第一行几乎相同。在构造函数外部初始化的实例字段在对super
@mastov**的隐式或显式调用后立即初始化super
。