在 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)
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.x
和this.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)
实际返回的内容。
归档时间: |
|
查看次数: |
8549 次 |
最近记录: |