【问题标题】:Java: NullPointerException from class.getResource( ... )Java:来自 class.getResource(...) 的 NullPointerException
【发布时间】:2016-11-11 17:25:46
【问题描述】:

我正在编写一个小型应用程序,当我尝试创建一个 ImageIcon 时,我总是遇到异常。异常是由这行代码引起的:

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

现在在我的程序中,文件夹 /icons/ 确实存在。我不知道这是否有所不同,但类文件位于包中,而图标文件夹位于项目文件夹中(当您会看到 bin 和 src 文件夹时)。

我环顾四周,找不到可以帮助我解决问题的解决方案。也许你们中的任何人都可以提供帮助?

编辑:有人询问我的文件夹层次结构:

我知道类文件与图标不在同一个文件夹中,但我已经制作了一些应用程序,我必须从不同的文件夹加载文件并且 /folder/ 总是可以正常工作。

编辑2:

System.out.println(getClass().getResource("/icons/icon_prayer.png") == null);

打印为真。

【问题讨论】:

  • 文件夹层次结构如何?当你说 /icons 文件夹存在时,它到底在哪里?
  • 您可能应该包含相关的错误消息 - 特别是堆栈跟踪 - 因为这将告诉我们问题发生的确切位置。
  • 我知道为什么我得到 NullPointer,但现在我不知道为什么 class.getResource( ... ) 为空。文件“icon_prayer.png”在文件夹“icons”中。
  • 是应用程序运行时classpath上的icons文件夹吗?
  • NPE 不是来自Class.getResource(),与您的标题相反。这是你没有检查结果造成的。

标签: java classpath


【解决方案1】:

我相信 NPE 是从 ImageIcon 构造函数中抛出的,因为 getResource 正在返回 null

尝试以下方法:

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

或者:

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

【讨论】:

  • 我试过getClass().getClassLoader().getResource("/icons/icon_prayer.png"),没有变化
  • @Martin Tuskevicius:我添加了另一种检索方法 - 试一试!
【解决方案2】:

据我所知,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() 方法将图标作为常规文件获取。这实际上是在Swing tutorials on Sun/Oracle own documentation 中建议的。

通常,应用程序会提供自己的一组图像作为一部分 的应用程序,因为是这种情况 与我们许多人使用的图像 演示。你应该使用类 getResource 方法获取路径 到图像。这允许 应用程序来验证图像 是可用的,并提供明智的 如果不是,则进行错误处理。当。。。的时候 图片不是应用程序的一部分, 不应使用 getResource 并且 使用 ImageIcon 构造函数 直接地。例如:

ImageIcon 图标 = 新 ImageIcon("图片/middle.gif", “一个漂亮但毫无意义的splat”);

希望这会有所帮助,祝你好运!

【讨论】:

    【解决方案3】:

    老线程,但是因为我刚才碰到了类似的问题......

    我正在使用 Eclipse,并使用系统命令 (cp) 将文件复制到“资源”文件夹。但是,eclipse 抛出了NullPointerException,因为我没有刷新“resources”文件夹。所以文件在那里,但 Eclipse 没有看到它。

    所以在 Eclipse 中:“包资源管理器”->“资源”-> 鼠标右键单击-> 刷新。这为我修好了。

    【讨论】:

    • IntelliJ IDEA 的相同修复:构建->“重建项目”成功了。
    【解决方案4】:

    我将我的音乐、图像等添加到添加到构建路径的文件夹中。然后我就用了

    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。如果你在默认包中,这不起作用。
    【解决方案5】:

    这行代码中唯一可以抛出NullPointerException的是第一个.,这意味着prayerLevel为空。

    【讨论】:

    • 这不是真的。如果提供的 URL 为 null,构造函数 ImageIcon(URL) 将抛出 NPE,因为实现很简单:public ImageIcon(URL location) { this(location, location.toExternalForm()); }
    • 但是 NullPointerException 不是(直接)由 this 行引起的,而是由构造函数中的某些行引起的。
    • 这是一个有争议的问题。无论哪种方式,如果 OP 包含堆栈跟踪,这一点就会很清楚。 OP 注意:包括相关的错误信息!
    • 作为构造函数参数提供的 URL 为空。
    • 你是对的,因此来自 ImageIcon 构造函数的 NPE。
    猜你喜欢
    • 2019-12-31
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多