java - ImageIO.read 抛出非法参数异常

标签 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. 

此外,我尝试恢复使用 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”(可以采用“相对”资源名称)与“绝对资源”(必须带有前导斜杠)的精彩讨论:

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

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

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

    关于java - ImageIO.read 抛出非法参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144211/

    相关文章:

    c++ - 是否可以使用 C++ 创建图像?

    php - 如何使用 PHP GD 库向图像添加文本

    java - 引用应用程序资源时的 NPE

    java - 如何读取另一个jar文件中的文件?

    java - 找到...对象,但使用 Java 堆栈预期出现 myClass 错误

    java - 使用 split 方法分割字符串

    java - 使用 java 的 Web 抓取(启用 Ajax/JavaScript 的页面)

    java - 如何使用 Espresso 访问 RecyclerView ViewHolder?

    image - 如何使用 ffmpeg 将自定义缩略图添加到 .mp4 文件?

    java - 当从 JAR 而不是 Eclipse 运行时,从我的 Java 应用程序打开 tmp PDF 时出错