ImageIO.read抛出非法参数异常

时间:2018-07-02 21:57:20

标签: java image embedded-resource

基本上,我正在尝试将一些图像数据作为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(filename)返回null。我的目录使得我的PacMan类位于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. 

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

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

2 个答案:

答案 0 :(得分:1)

如果路径根“ / 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”(可以使用“相对”资源名称)与“绝对资源”(其中必须使用反斜杠)的讨论非常出色:< / p>

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)。

答案 1 :(得分:1)

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