我用Java制作了一个游戏。它在Eclipse中完全正常工作。
我将其导出为Runnable JAR。双击它的图标时,它不会打开。所以我尝试从命令行运行JAR。
我在尝试检索图像资源的一行代码中遇到NullPointerException
错误(正如我所说,它在Eclipse中工作正常)。这是发生错误的代码行:
ball = new ImageIcon(this.getClass().getResource("sprites/ball.PNG"));
我不知道出了什么问题。这是我项目的结构:
有什么想法吗?我开始变得绝望了。
非常感谢你的帮助。
编辑:我尝试在/
的开头添加sprites/ball.PNG
。没有帮助。还尝试将PNG
更改为png
。也没用。
在JAR内部检查,图像在里面。我在Windows上。
这是stacktrace:
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init><Unknown Source>
at instPanel.<init><instPanel.java:17>
at Main.<init><Main.java:23>
at Main.main<Main.java:38>
编辑:我使用的事实(默认包)是否有问题?
答案 0 :(得分:2)
您是否尝试使用/sprites/ball.PNG调用getResource
?
其他问题:你是linux系统吗?如果是这样,你应该注意大写(ball.PNG vs. ball.png)。
修改强>
BufferedImage image = ImageIO.read(getClass().getResource("/sprites/ball.PNG"));
ImageIcon icon = new ImageIcon(image);
答案 1 :(得分:2)
如果您使用存档工具查看jar内部,它应该是这样的。
JARROOT/*.class
JARROOT/sprites/ball.png
您可以尝试以下。
在Eclipse中右键单击sprites文件夹。单击Build Path -> Use as Source Folder
并重新打包项目。
你对资源的调用应该是
this.getClass().getResource("/sprites/ball.png");
或
this.getClass().getResource("/ball.png");
取决于Eclipse如何打包jar。
编辑:请阅读documentation。
如果传递给getResource("")
的字符串以'/'开头,它将被视为jar中的绝对路径。如果字符串以'/'开头,则将其视为该类的相对路径。
这是一个带注释的简单项目的图像。
文件夹“icons”是资源文件夹。它的内容将打包在jar中。在这种情况下JARROOT/other/zoom-out-icon.JPG
和JARROOT/zoom-in-icon.jpg
。
答案 2 :(得分:1)
您使用this.getClass().getResource("sprites/ball.PNG")
加载网址但会返回:
“java.net.URL对象;如果找不到具有此名称的资源,则返回null”。
因此ImageIcon(URL location)
中的构造函数的值为null,如果查看构造函数,您将看到以下行:this(location, location.toExternalForm());
。
问题在于,作为位置的确切行为空,因此location.toExternalForm()
会抛出您的NPE。
您可以使用
修复它image = this.getClass().getResource("sprites/ball.PNG");
if (image != null) {
ball = new ImageIcon(image);
}
但潜在的问题是找不到图像。
您可以找到(并修复)错误:
1在某处打印它将要查看的路径:
URL resource = this.getClass().getResource("/");
resource.getFile(); // print me somehwere
URL resource = this.getClass().getResource("img/");
resource.getFile(); // print me as well
URL resource = this.getClass().getResource("img/ball.PNG");
resource.getFile(); // print me as well
2确保图像名称/路径与案例完全匹配,因为它可能区分大小写。
答案 3 :(得分:1)
我尝试了你提供的代码并遇到了与大写PNG文件相同的问题。之后,当使用'ball.png'时,使用以下命令:
java -classpath test.jar MainClass
我可以访问该图片。你使用的命令是什么?
jar -tf Test.jar的输出:
META-INF/MANIFEST.MF
.classpath
Test.class
sprites/ball.png
.project
答案 4 :(得分:0)
谢谢。在显然以Netbeans IDE运行的Windows 7机器上,路径名不区分大小写-但是突然在同一机器文件名下以Java Se 8.2运行JAR文件时,大小写为 敏感。