我当前的项目在 Eclipse 中运行时没有错误。但是,在导出到可运行的 jar 后,它根本不起作用。从命令提示符运行会产生以下错误消息:
Uncaught error fetching image:
java.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(Unknown Source)
at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
at sun.awt.image.ImageFetcher.run(Unknown Source)
测试使我得出结论,当我尝试加载项目所需的图像时会发生错误,其行类似于以下内容:
grassTile1 = rl.getImage("\\grassTile1.png");
rl 是 ResourceLoader 的一个实例,其 getImage 如下:
public Image getImage(String x){
URL y = this.getClass().getResource(x);
System.out.println(y);
Image img = tk.getImage(y);
if(img==null) throw new IllegalArgumentException("Image at "+x+" not found.");
System.out.println(y);
return new ImageIcon(img).getImage();
}
tk 是通过 Toolkit.getDefaultToolkit(); 获得的。这些图像与 jar 中的 ResourceLoader.class 存在于同一目录中。注释掉对 loadImages() 的调用(其中包含对 ResourceLoader 的唯一调用)会导致程序运行,但显然没有图像资源。
该程序在 Eclipse 中按预期运行。应该对引用的相对路径进行哪些更改,以便它们在编译到 jar 时能够正常运行?
编辑:根据反馈更改 ResourceLoader.getImage()。
public Image getImage(String x){
URL y = this.getClass().getResource(x);
System.out.println(y);
ImageIcon icon = new ImageIcon(getClass().getResource(x));
Image i = icon.getImage();
return i;
}
这比我写的原始 getImage() 函数好还是坏?
更新二:根据 Perception 的建议,从传递给 getImage() 的数据中删除前导斜杠解决了问题。