ImageIO.read 引发的非法参数异常

Illegal Argument exception thrown by ImageIO.read

基本上,我试图将一些图像数据作为 ImageIcon 对象加载到 java 中。我最初尝试简单地执行 ImageIcon image = new ImageIcon(filename),但这使得图像在导出为 JAR 文件时无法加载。我的新方法是这样的:

private static ImageIcon getImage(String filename) {
    try {
        URL url = PacMan.class.getResource(filename);
        Image image = ImageIO.read(url);
        return new ImageIcon(image);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

错误是因为 PacMan.class.getResource(文件名) returns 为空。我的目录是这样的,我的 PacMan class 在 src/Model/PacMan 中,我的图像具有以下文件路径:

src/Model/PacMan_Images/PacMan_EAST, 
src/Model/PacMan_Images/PacMan_SOUTH, 
src/Model/PacMan_Images/PacMan_WEST, 
src/Model/PacMan_Images/PacMan_NORTH. 

此外,我已经尝试恢复使用 new ImageIcon(filepath) 并且图像加载正常所以我知道图像存在于我的目录中。有人知道可能是什么问题吗?

编辑:我的错误是抛出 IllegalArgumentException,因为我将 null 作为 ImageIO.read(url) 的参数传递,因为 url 为 null。

如果路径根目录“/src”实际上被导入到您的 .jar 中,我会感到惊讶。请试试这个:

  1. 查看 .jar 内部。例如,使用 7Zip 查看文件的实际路径。

  2. 尝试将文件名更改为 "Model/PacMan_Images/PacMan_EAST"。

  3. 在此处查看有关 Java getResource() 的更多详细信息:

http://www.novixys.com/blog/read-file-resources-folder-java/

https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html

Java Swing: Displaying images from within a Jar

附录:

  1. 我会下载 7-Zip 并检查您的 .jar 文件以熟悉该格式。它只是一个 .zip 文件...但了解其中的内容并能够对其进行修改(如果仅用于故障排除)通常很有用。

  2. 这是关于 "Class.getResource"(可以使用 "relative" 资源名称)与 "absolute resource"(必须 有前导斜杠):

What is the difference between Class.getResource() and ClassLoader.getResource()?

  1. 最后,这里有一个重构代码以避免编译器警告的建议:

    private static ImageIcon getImage(String filename) {
        ImageIcon imageIcon = null;
        try {
            URL url = PacMan.class.getResource(filename);
            Image image = ImageIO.read(url);
            imageIcon = new ImageIcon(image);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return imageIcon;
    }
    

还有许多其他选项,包括仅禁用该特定警告(例如@SuppressWarnings)。

错误是我传递的文件名是 Model/PacMan_Images/PacMan_EAST 而不是 /Model/PacMan_Images/PacMan_EAST。事实证明,额外的/确实有所作为。感谢@MadProgrammer 的帮助,感谢@paulsm4 提供的额外资源,以及所有发表评论的人。