尝试使用图像资源时出现NullPointerException

时间:2014-01-24 08:44:34

标签: java jar nullpointerexception project

我用Java制作了一个游戏。它在Eclipse中完全正常工作。

我将其导出为Runnable JAR。双击它的图标时,它不会打开。所以我尝试从命令行运行JAR。

我在尝试检索图像资源的一行代码中遇到NullPointerException错误(正如我所说,它在Eclipse中工作正常)。这是发生错误的代码行:

ball = new ImageIcon(this.getClass().getResource("sprites/ball.PNG"));

我不知道出了什么问题。这是我项目的结构:

enter image description here

有什么想法吗?我开始变得绝望了。

非常感谢你的帮助。

编辑:我尝试在/的开头添加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>

编辑:我使用的事实(默认包)是否有问题?

5 个答案:

答案 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.JPGJARROOT/zoom-in-icon.jpg

enter image description here

答案 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文件时,大小写为 敏感。