空指针异常

-1 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 TileEngine.drawMap(TileEngine.java:52)
     at GraphicsCanvas.<init>(GraphicsCanvas.java:32)
     at Main.<init>(Main.java:22)
     at Main.main(Main.java:18)
Run Code Online (Sandbox Code Playgroud)

在 Netbeans 之外编译不会出错并且执行正常。

经过评论的反复试验,我来到了这些对导致问题的 Actor 的匿名调用。这是代码的功能,当注释掉时不会抛出异常。我似乎找不到任何问题。

public class Actor extends Entity
{
    Actor(String filename, int x, int y)
    {
        super(filename, x, y);
    }
}


void drawMap(String imgWalkable, String imgNotWalkable, GraphicsCanvas gp)
    {
        // Since each 1 tile is a tile that can be walked on
        // we need to set the 1 tile to something you can walk on.
        // The tiles that cannot be walked on are the ones that are 0

        for (int x = 0; x < WID; x++)
        {
            for (int y = 0; y < HEI; y++)
            {
                if (GRID[x][y] == 1)
                    gp.add(new Actor(imgWalkable, x * TILE_WID, y * TILE_HEI));
                //else
                    //gp.add(new Actor(imgNotWalkable, x * TILE_WID, y * TILE_HEI));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经进一步将此错误追溯到我Entity班级中的BufferedImage 。

public class Entity extends JLabel
{
    Entity(String filename, int x, int y)
    {
        this.x = x;
        this.y = y;
        this.setLocation(this.x, this.y);
        bImg = loadImage(filename);
        this.setSize(bImg.getWidth(), bImg.getHeight());
        ImageIcon icon = new ImageIcon(bImg);
        setIcon(icon);
    }

    public BufferedImage loadImage(String filename) {
        BufferedImage tmp = null;
        try {
            tmp = ImageIO.read(getClass().getResource(filename));
        } catch (Exception e) { }
        return tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

删除 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);
    }
Run Code Online (Sandbox Code Playgroud)

收到此新错误:

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)
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

Entity.<init>(Entity.java:24)
Run Code Online (Sandbox Code Playgroud)

这告诉您在“Entity.java”的第 24 行抛出异常。你没有告诉我们那是哪一行(tsk,tsk,tsk!!)……但我希望是这样的:

this.setSize(bImg.getWidth(), bImg.getHeight());
Run Code Online (Sandbox Code Playgroud)

并且它正在发生是因为loadImage正在返回null

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

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

this.setLocation(this.x, this.y);
Run Code Online (Sandbox Code Playgroud)

编辑

问题现在在这一行:

bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25
Run Code Online (Sandbox Code Playgroud)

问题是getClass().getResource(filename)返回null并将其传递给ImageIO.read结果是抛出 NPE。javadoc forClass.getResource(String)表示null如果找不到资源,则该方法返回。

是你的问题。如果您不相信此诊断,请添加一些痕迹以查看getClass().getResource(filename)实际返回的内容。