0

我正在为 PC 创建一个 Breakout 的克隆,今​​晚早些时候我发现有一个 NullPointerException 被抛出并显示在控制台中。奇怪的是,该方法run()被告知要捕获发生的任何异常并显示其堆栈跟踪,然后忽略它们,但这一次它在开始时冻结游戏,在日志中,按键仍然被跟踪,但游戏中没有任何反应。显然,游戏并没有中止,而是不会重新绘制。

它似乎来自一行代码:

 if (by >= bricks[0].y && by <= bricks[0].y + bricks[0].img.getHeight(null) && bx >= bricks[0].x && bx <= bricks[0].x + bricks[0].img.getWidth(null)) {

这是日志和堆栈跟踪(整个事情):

Game starting, menu boot.
Menu Loaded, JFrame visible.
Running thread.
Play clicked, start game initialization.
Creating JFrame.
JFrame created and visible.
Starting game thread
Initialize user variables.
Initialized user variables.
Initialization complete, start game.
java.lang.Execption in line 86/87, class Game. Stacktrace:
java.lang.NullPointerException
    at Game.move(Game.java:195)
    at Game.run(Game.java:86)
    at java.lang.Thread.run(Thread.java:722)
Space hit!
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT hit.
Key ARROWLEFT released.
Key ESCAPE Hit!

我希望这个问题可以得到解决。

4

2 回答 2

2

让我们看看那条“线”:

   if (by >= bricks[0].y && 
       by <= bricks[0].y + bricks[0].img.getHeight(null) && 
       bx >= bricks[0].x && 
       bx <= bricks[0].x + bricks[0].img.getWidth(null)) {

假设bx,byxandy字段都是原始类型(例如),那么这里列出了可能导致 NPEint的事物:

  • bricks变量是null
  • 的第零个元素bricksnull
  • bricks[0].img值为null

如果bxbyx/或y是包装器类型,则其中之一可能是null. 拆箱值时,这将导致 NPE。

它不是由传递nullgetHeightorgetWidth方法引起的,因为 1)我认为这是有效的,并且 2)如果不是,那么 NPE 将被扔到与你的堆栈跟踪显示的不同的地方。

(我无法判断传递null这些调用是否正确......但无论哪种方式,根据您提供的证据,这不是导致此 NPE 的原因。)


如果您想弄清楚问题的真正原因,请调试代码或添加一些跟踪图来测试哪些可能null是实际的null

于 2013-09-04T00:27:58.087 回答
0

这个答案是假设你的brick[0].img 是java.awt.Image 类型。您在 getHeight 和 getWidth 方法中都将 ImageObserver 设置为 null。如果你真的希望图像显示在某个地方,你需要把那个东西作为 ImageObserver。

http://docs.oracle.com/javase/7/docs/api/java/awt/image/ImageObserver.html

Button、Panel 或您尝试放置图像的位置可能应该传递给 getWidth 和 getHeight 方法,因为它很可能实现了 ImageObserver 接口。

于 2013-09-04T00:28:08.230 回答