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 中,我会感到惊讶。请试试这个:
查看 .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"(可以使用 "relative" 资源名称)与 "absolute resource"(必须 有前导斜杠):
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)。
错误是我传递的文件名是 Model/PacMan_Images/PacMan_EAST 而不是 /Model/PacMan_Images/PacMan_EAST。事实证明,额外的/确实有所作为。感谢@MadProgrammer 的帮助,感谢@paulsm4 提供的额外资源,以及所有发表评论的人。
基本上,我试图将一些图像数据作为 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 中,我会感到惊讶。请试试这个:
查看 .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"(可以使用 "relative" 资源名称)与 "absolute resource"(必须 有前导斜杠):
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)。
错误是我传递的文件名是 Model/PacMan_Images/PacMan_EAST 而不是 /Model/PacMan_Images/PacMan_EAST。事实证明,额外的/确实有所作为。感谢@MadProgrammer 的帮助,感谢@paulsm4 提供的额外资源,以及所有发表评论的人。