0

我当前的项目在 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() 的数据中删除前导斜杠解决了问题。

4

0 回答 0