为什么JVM声称我的PNG不存在?

时间:2014-12-31 00:15:07

标签: java swing embedded-resource

我正在尝试在JFrame上设置左上角的图像。但是,它声称我的PNG文件是不存在的。我用

设置了图标
mainFrame.setIconImage(new ImageIcon(getClass().getResource("C:/Users/Steve/Programming/Projects/Java/BibleReader/bibleReader/src/test/resources/assets/bible/textures/icon.png")).getImage());

这是错误

Exception in thread "main" java.lang.NullPointerException at
javax.swing.ImageIcon.<init>(Unknown Source) at
com.nickson.input.UI.prepareGUI(UI.java:42) at
com.nickson.input.UI.<init>(UI.java:33) at
com.nickson.main.Engine.main(Engine.java:19)

为什么会这样?

1 个答案:

答案 0 :(得分:3)

  

为什么会这样?

您正在尝试使用文件系统中的路径打开资源。资源路径应该相对于应用程序类路径上的目录或JAR文件。

因此,在您的特定情况下,类加载器正在查找相对于当前类的资源位置的名为“C:”的资源文件夹。当然,它不存在。如果getResource无法找到资源,null会返回"/assets/bible/textures/icon.png",这会导致NPE。

以下是几页,详细说明了资源加载和资源路径解析的实际工作原理:


作为猜测,并假设您正在使用Maven,我认为如果您的代码在单元测试中运行,路径.../main/resources/将起作用。对于生产代码,我认为你的资源在错误的树中;它应该在{{1}}树中。