基本上我正在尝试将一些图像数据作为 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 中,我会感到惊讶。请尝试这个:
查看 .jar 内部。例如,使用 7Zip查看文件的实际路径。
尝试将文件名更改为“Model/PacMan_Images/PacMan_EAST”。
在此处查看有关 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
附录:
我会下载 7-Zip 并检查您的 .jar 文件,以熟悉该格式。它只是一个 .zip 文件...但了解其中的内容并能够对其进行修改(如果仅用于故障排除)通常很有用。
这里有一个关于“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/