问题:
我一直用Java创建一个Snake游戏,一切都很顺利。我唯一的问题就是显示得分。每当蛇“吃掉”一个苹果时,分数增加10.而不是显示当前分数,它只是在没有实际删除它的情况下写入当前分数。当我在重新显示之前尝试擦除内容时,我收到错误,除了我的背景颜色之外什么也没有出现。
我有其他图形组件,包括我不想受影响的paint()。
我的尝试(理论):
我使用调用
的Graphics对象显示分数
drawString(“当前得分:”+ currScore,0,(Constants.TOTAL_HEIGHT + 15));
我想我必须调用clearRect()方法,这对我来说很有意义。不幸的是,我在指定clearRect()的行中得到NullPointerException。
我没有使用Graphics2D,所以我可以先熟悉Graphics。如果解决此问题涉及Graphics2D,我使用它没有问题。
我的尝试(相关方法):
public void displayScore(Graphics g) {
//clearScore.clearRect(0, getY(), getWidth(), getHeight());
//g.clearRect(0, getY(), getWidth(), getHeight());
g.drawString("Current score: " + currHighScore, 0, (Constants.TOTAL_HEIGHT + 15));
}
在代码中,clearScore是在任何方法之外的类中声明的Graphics对象。我使用它的原因是为了避免影响其他图形。我尝试了每个clearRect()行,并且都生成了相同的NullPointerException,这就是我将它们注释掉的原因。 (Constants.TOTAL_HEIGHT + 15)负责分配Y坐标。
错误讯息:
Exception in thread "Thread-3" java.lang.NullPointerException
at com.nmw.view.CanvasFrame.displayScore(CanvasFrame.java:149)
at com.nmw.view.CanvasFrame.drawAll(CanvasFrame.java:43)
at com.nmw.view.CanvasFrame.run(CanvasFrame.java:64)
at java.lang.Thread.run(Thread.java:722)
drawAll是我调用所有方法的地方,这些方法使用Graphics来绘制游戏的一部分。
为冗长的问题道歉= /
答案 0 :(得分:2)
您的问题是您可能尝试使用null Graphics对象进行绘制。如果你没有使用paint(...)
方法(如果是AWT)或paintComponent(...)
如果是Swing,则通常会发生这种情况。解决方案,
说实话,你的陈述:"I have other Graphics components, including a paint() that I do NOT want affected."
- 如果这是一个AWT项目并且你不想使用标签,则是不切实际的要求。
这句话:
在代码中,clearScore是在任何方法之外的类中声明的Graphics对象。我使用它的原因是为了避免影响其他图形。
不是你应该如何做画。你现在发现原因了。如果您在程序运行期间碰巧获得了Graphics上下文,使用它将Graphics分配给您的类字段,然后尝试使用该类字段,您将经常得到NPE,就像您看到的那样,因为Graphics对象由此获得的并不长久。
如果您需要更深入的帮助,请发布您的实际作业要求和更多代码。特别是你的绘图方法。最好是创建并发布sscce。
修改强>
您在评论中说明:
My Snake游戏是一个独立的项目,我一直在努力学习更多有关Graphics的知识。我只使用AWT库,但是,我会尝试使用Label。感谢您对我收到NullPointerException
的原因的回复和解释
如果这是针对您自己的项目而不是学校作业,那么我认为您将避免使用AWT而是使用Swing。它比AWT更强大,更灵活。你现在没有理由想要使用AWT。