Java 空指针异常

Java 空指针异常,java,netbeans,compilation,Java,Netbeans,Compilation,在Netbeans中编译应用程序并在Netbeans中运行应用程序之后,它就可以正常工作了 所有图像加载正常。 尝试双击执行应用程序不会导致任何结果 尝试从命令行运行时出现以下错误: Exception in thread "main" java.lang.NullPointerException at Entity.<init>(Entity.java:24) at Actor.<init>(Actor.java:5) at TileEng

在Netbeans中编译应用程序并在Netbeans中运行应用程序之后,它就可以正常工作了

所有图像加载正常。

尝试双击执行应用程序不会导致任何结果

尝试从命令行运行时出现以下错误:

Exception in thread "main" java.lang.NullPointerException
     at Entity.<init>(Entity.java:24)
     at Actor.<init>(Actor.java:5)
     at TileEngine.drawMap(TileEngine.java:52)
     at GraphicsCanvas.<init>(GraphicsCanvas.java:32)
     at Main.<init>(Main.java:22)
     at Main.main(Main.java:18)
删除loadImage函数并按如下方式加载图像后:

Entity(String filename, int x, int y)
    {
        try {
        bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25
        } catch (IOException ex) {
            Logger.getLogger(Entity.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.x = x;
        this.y = y;
        this.setLocation(this.x, this.y);
        //bImg = loadImage(filename);
        //loadImage(bImg, filename);
        this.setSize(bImg.getWidth(), bImg.getHeight());
        Icon icon = new ImageIcon(bImg);
        setIcon(icon);
        setVisible(isAlive);
    }
收到此新错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: input == null!
     at javax.imageio.ImageIO.read(ImageIO.java:1362)
     at Entity.<init>(Entity.java:25)
线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常:输入==null! 在javax.imageio.imageio.read(imageio.java:1362) at实体(Entity.java:25) 这是因为
loadImage
返回
null

另一个问题(虽然不是NPE的原因)是以下行在初始化之前使用了
this.x
this.y
。事实上,构造函数根本不会初始化它们

还有一个问题是,您的
loadImage
方法被显式编码为捕获和忽略异常,并返回
null
。因此,基本上,如果图像读取因任何原因失败,您将永远不会知道它。这使人们对您关于映像正在成功加载的断言产生了相当大的怀疑。即使这不是问题的原因,挤压这样的异常也是非常糟糕的做法

this.setLocation(this.x, this.y);
编辑

现在问题出在这一行:

bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25
问题是
getClass().getResource(filename)
返回
null
,并将其传递给
ImageIO.read
,从而引发NPE。for的javadoc表示,如果找不到资源,该方法将返回
null


那是你的问题。如果您不相信此诊断,请添加一些traceprints以查看实际返回的
getClass().getResource(文件名)

传递给loadImage的文件名是相对路径吗?如果是这样,它可以成功地从IDE内部加载映像,但不能从IDE外部加载。这将允许文件在IDE中正确加载,但可能会导致来自其他环境的空指针异常。如果是这种情况,使用绝对路径可能会解决问题。

如果您使用
getResource()
,就像您在发生错误的行中所做的那样:

bImg = ImageIO.read(getClass().getResource(filename));
然后Java将查找要加载到类路径上的文件。
filename
包含什么?它是否位于正确的位置,以便可以相对于类路径找到它

另外,捕获并忽略异常,就像您在
Entity.loadImage()方法中所做的那样:

try {
    tmp = ImageIO.read(getClass().getResource(filename));
} catch (Exception e) { }
这是作为Java开发人员所犯下的最严重的错误之一。不要那样做;至少记录异常,以其他方式处理它,或者声明发生异常的方法抛出异常。例如:

// Declare that the method might throw IOException
public BufferedImage loadImage(String filename) throws IOException {
    // ...

    // No need to try / catch the exception now
    tmp = ImageIO.read(getClass().getResource(filename));
}

@垃圾神:那个问题已经解决了。问题在于我的TileEngine类很容易找到和修复。异常准确地告诉您NPE发生的行。使用您最喜欢的调试方法(以及您的“批判性思维”)。我建议您学习使用调试器,它允许您检查状态并“逐步”完成代码;正在加载图像没有意义,但BufferedReader保持为null。可能的重复没有意义,因为正在加载图像loaded@mOOst-好的,1)你没有告诉我们第25行是什么,2)你给我们的证据似乎就是指这个。我忘了包括init'n x/y的代码。问题不在于loadImage函数。问题在于ImageIcon本身。我将更新帖子。@Stephen C:完全删除了loadImage,并尝试在没有loadImage的情况下加载。查看新代码,您将看到新错误。调试后,我注意到即使成功加载映像,bImg也始终为空。您是否在所有环境中都验证了这一点?IDE内部加载的图像并不意味着它们在IDE外部加载。getResource(filename)可以让您在某些环境中使用它,但在其他环境中却不能。例如,可能NetBeans正在使工作目录成为项目中的一个特定点。命令行调用不能做到这一点。您发布的代码不包括您可能拥有的任何额外支票。您是否尝试过在分配tmp后立即检查它是否为null。我正在使用相对路径加载。是的,我检查了tmp,它保持为空;但就像我说的,图像正在加载,这是没有意义的。
bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25
bImg = ImageIO.read(getClass().getResource(filename));
try {
    tmp = ImageIO.read(getClass().getResource(filename));
} catch (Exception e) { }
// Declare that the method might throw IOException
public BufferedImage loadImage(String filename) throws IOException {
    // ...

    // No need to try / catch the exception now
    tmp = ImageIO.read(getClass().getResource(filename));
}