Java:从class.getResource(...)发生NullPointerException

10

我正在编写一个小应用程序,当我尝试创建一个ImageIcon时,总是会出现异常。这个异常是由以下代码引起的:

prayerLevel.setIcon(new ImageIcon(getClass().getResource("/icons/icon_prayer.png")));

现在在我的程序中,文件夹/icons/是存在的。我不知道这是否有区别,但类文件位于一个包内,而图标文件夹位于项目文件夹中(当您看到bin和src文件夹时)。
我已经找了一段时间,但我找不到解决问题的方法。也许你们中的任何人都可以帮忙?
编辑:有人问我的文件夹层次结构: Folder Hierarchy 我知道类文件不在与图标相同的文件夹中,但我曾经制作过需要从不同文件夹加载文件的应用程序,并且使用/folder/总是有效。
编辑2:
System.out.println(getClass().getResource("/icons/icon_prayer.png") == null);

打印出 true。


1
文件夹层次结构是什么样子的?当你说/icons文件夹存在时,它确切地在哪里? - posdef
你应该包含相关的错误信息 - 特别是堆栈跟踪 - 这将向我们展示问题发生的确切位置。 - Nate W.
我已经找出为什么会出现NullPointer,但现在我无法弄清楚为什么class.getResource(...)为空。文件'icon_prayer.png'位于文件夹'icons'中。 - Martin Tuskevicius
应用程序运行时,图标文件夹是否在类路径上? - matt b
NPE并不是来自于Class.getResource(),与你的标题相反。它是由于你未能检查结果而导致的。 - user207421
5个回答

13

我认为空指针异常是由ImageIcon 构造函数抛出的,因为 getResource 返回了null

请尝试以下方法:

getClass().getClassLoader().getResource("/icons/icon_prayer.png")

或者:

ClassLoader.getSystemResource("/icons/icon_prayer.png")

1
我尝试了 getClass().getClassLoader().getResource("/icons/icon_prayer.png"),但没有变化。 - Martin Tuskevicius
@Martin Tuskevicius:我增加了另一种检索方法-试试看吧! - Nate W.

4
据我所知,getResource()会查找已知资源的位置,换句话说,如果文件夹/icons/不被视为资源文件夹,则不会像您期望的那样。据我所知,有两种方法可以解决这个问题:
1)将图标文件夹设置为应用程序的资源,然后您就可以使用getResource()方法,例如:URL css_url = getClass().getResource("/resource/style.css");。有关此选项的更多信息,请参见http://lj4newbies.blogspot.com/2008/03/using-classgetresource-load-resource.html
2)获取图标作为常规文件,而不使用getResource()方法。这实际上是在Sun/Oracle自己的Swing教程中建议的做法
希望这可以帮助到您,祝好运!

3

虽然这是一个老帖子,但我刚遇到了类似的问题...

我正在使用Eclipse,并使用系统命令(cp)将文件复制到“资源”文件夹中。然而,由于我没有刷新“资源”文件夹,因此Eclipse抛出了一个NullPointerException。所以文件确实存在,但Eclipse没有看到它。

在Eclipse中: "Package Explorer" -> "resources" -> 鼠标右键单击 -> 刷新。这对我有用。


1
同样的修复方法适用于IntelliJ IDEA:选择“Build”->“Rebuild project”即可解决问题。 - logi-kal

2
我将我的音乐、图像等添加到了一个已添加到构建路径的文件夹中。然后我只需要使用:
URL url="CurrentClass".class.getClassLoader().getResource("media file name not the path");
setIconImage(new ImageIcon(url.getPath()).getImage());

设置图像图标。


这个方法很有用。我将我的Resources/data文件夹添加到了类路径中,但我只是使用了class.getResource而不是class.getClassLoader().getResource。如果你在默认的包中,它是不能工作的。 - Randy
这里有一篇不错的文章: https://howtodoinjava.com/java/io/read-file-from-resources-folder/ - qwebek

-3
这行代码中唯一可能抛出 NullPointerException 的是第一个 .,这意味着 prayerLevel 是 null。

1
这是不正确的。如果提供的URL为空,构造函数ImageIcon(URL)将抛出NPE异常,因为其实现只是:public ImageIcon(URL location) { this(location, location.toExternalForm()); } - Nate W.
但是,NullPointerException并非由此行直接引起,而是由构造函数中的某一行引起的。 - Roland Illig
这是一个无意义的观点。无论如何,如果 OP 包含了堆栈跟踪,这一点将会很清楚。提示给 OP:请包含相关的错误信息! - Nate W.
构造函数提供的URL参数为空。 - Martin Tuskevicius
你是正确的,因此ImageIcon构造函数会导致NPE。 - Nate W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接