我正在为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!
希望这个问题能解决。
最佳答案
让我们看一下这条“线”:
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
,by
和x
和y
字段都是原始类型(例如int
),那么下面列出了可能导致NPE的事物:bricks
变量是null
bricks
的第零个元素是null
bricks[0].img
的值是null
如果
bx
,by
,x
和/或y
是包装器类型,则其中之一可以是null
。将值拆箱会导致NPE。这不是由于将
null
传递给getHeight
或getWidth
方法引起的,因为1)我认为这是有效的,并且2)如果不是,则NPE会被扔到与stacktrace不同的地方节目。(我无法确定在这些调用中传递
null
是否正确……但是,无论哪种方式,根据您提供的证据,这都不是造成该NPE的原因。)如果您想找出导致问题的真正原因,请调试代码或添加一些跟踪记录,以测试可能是
null
的哪些内容实际上是null
。关于java - 为什么在引用来自其他类的Image时会出现java.lang.NullPointerException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18603439/