当前项目在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()函数更好还是更差?
UPDATE TWO:从传入getImage()的数据中删除前导斜杠修复了问题,如Perception所示。