为什么在引用其他类的Image时会出现java.lang.NullPointerException?

时间:2013-09-04 00:13:44

标签: java eclipse swing

我正在为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)) {

这是log和stacktrace(整个事情):

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!

我希望这个问题能够得到解决。

2 个答案:

答案 0 :(得分: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)) {

假设bxby以及xy字段都是基本类型(例如int),那么这里是一个列表可以导致NPE:

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

如果bxbyx和/或y是包装类型,则其中一个可能是null。这会在拆箱时导致NPE。

这不是因为null传递给getHeightgetWidth方法造成的,因为1)我认为这是有效的,2)如果不是那么NPE会是扔在与堆栈跟踪显示的不同的地方。

(我不知道在这些调用中传递null是否正确 ...但无论如何,根据您提供的证据,这不是NPE的原因。)


如果您想知道导致问题的实际是什么,请调试代码或将一些跟踪图添加到 test 哪些内容可能是null实际上是null

答案 1 :(得分: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

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