我正在为 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 将被扔到与堆栈跟踪显示的不同的位置。
(我无法判断在这些调用中传递 null
是否正确...但无论哪种方式,根据您提供的证据,这都不是导致此 NPE 的原因。)
如果您想弄清楚到底是什么导致了问题,请调试代码或添加一些跟踪记录来测试哪些可能是 null
实际上是null
.
关于java - 为什么从不同的类引用 Image 时会出现 java.lang.NullPointerException ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18603439/