java - 为什么从不同的类引用 Image 时会出现 java.lang.NullPointerException ?

标签 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)) {

这是日志和堆栈跟踪(整个内容):

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 ,以及xy字段都是原始类型(例如 int ),那么这里是可能导致 NPE 的列表:

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

如果bx , by , x和/或y是一种包装类型,那么其中之一可能是 null 。这会在拆箱该值时导致 NPE。

不是通过null引起的到getHeightgetWidth方法,因为 1) 我相信这是有效的,2) 如果不是,那么 NPE 将被扔到与堆栈跟踪显示的不同的位置。

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

<小时/>

如果您想弄清楚到底是什么导致了问题,请调试代码或添加一些跟踪记录来测试哪些可能是 null实际上是null .

关于java - 为什么从不同的类引用 Image 时会出现 java.lang.NullPointerException ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18603439/

相关文章:

java - 在构建字符串并将它们添加到 ArrayList 时出错

java - 是否可以使用java和Apache POI库逐行写入excel文件

java - eclipse.ui.menus 的名称过滤器

java - 调试和运行 GWT/GAE 应用程序的客户端/服务器代码

java - JFrame多种样式

java - GridBagLayout 中的对齐问题

java - 找不到错误 (StackOverflowError)

java - 如何改变java中算术运算符的优先级?

java - "pool.execute"(线程池执行器)在Java 7中的使用

java - 如何在java中读取excel数据,selenium测试?