基本上,我正在尝试将一些图像数据作为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。
答案 0 :(得分:1)
如果路径根“ / 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”(可以使用“相对”资源名称)与“绝对资源”(其中必须使用反斜杠)的讨论非常出色:< / p>
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)。
答案 1 :(得分:1)
错误是我以文件名Model / PacMan_Images / PacMan_EAST而不是/ Model / PacMan_Images / PacMan_EAST传递。事实证明,额外的/确实有所作为。感谢@MadProgrammer的帮助,感谢@ paulsm4的额外资源,以及其他发表评论的人。