当我尝试从Eclipse中的资源目录中加载图像时,我不断收到空指针异常(NPE)。 res文件夹位于项目目录中。 这是我获得NPE的地方:
image.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("res/bg.jpg")).getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
当我删除getClass()。getReource()时,将返回图像:
image.setIcon(new ImageIcon(new ImageIcon(("res/bg1.jpg")).getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH)));
当我打印res目录的URL时,我得到的是空值:
URL resource = this.getClass().getResource("/");
resource.getFile(); // print me somehwere
URL resource1 = this.getClass().getResource("/res");
resource.getFile(); // print me as well
URL resource2 = this.getClass().getResource("res/bg2");
resource.getFile(); // print me as well
System.out.println("Reource1 : " + resource);
System.out.println("Reource1 : " + resource1);
System.out.println("Reource1 : " + resource2);
输出:
资源1:文件:/ C:/用户/ cmooney / eclipse-workspace / TextSimplifier / bin /
资源1:null
Reource1:空
我已经多次刷新,清理并构建了项目。
知道为什么会这样吗?
谢谢
答案 0 :(得分:1)
来自官方Java文档:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResource-java.lang.String-
查找具有给定名称的资源。搜索与给定类关联的资源的规则由该类的定义类加载器实现。该方法委托给该对象的类加载器。如果此对象是由引导类加载器加载的,则该方法将委托给ClassLoader.getSystemResource(java.lang.String)。
在委派之前,使用以下算法从给定资源名称构造绝对资源名称:
如果名称以'/'开头('\ u002f'),则资源的绝对名称是名称后面'/'的一部分。
< / li>
否则,绝对名称的格式如下:
modified_package_name / name
其中Modifyed_package_name是此对象的软件包名称,用“ /”代替“。”。 ('\ u002e')。
答案 1 :(得分:1)
将this.getClass().getResource("res/bg.jpg")
替换为this.getClass().getResource("../res/bg.jpg")
由于this.getClass().getResource("/")
返回file:/C:/Users/cmooney/eclipse-workspace/TextSimplifier/bin/
,因此您需要在目录结构中上移一个目录(目录),以便可以进入res
目录。就像cd ../res
当前位置的file:/C:/Users/cmooney/eclipse-workspace/TextSimplifier/bin/
注意:在您所附的屏幕截图中,我看不到bg.jpg
。确保您在此路径中有bg.jpg
。
答案 2 :(得分:1)
我认为您的目录结构错误。 如果“ /”指向bin目录(如第一个资源的输出所示),则“ / res”指向bin的res子目录,而不是bin父目录中的同级兄弟。
您需要移动res目录或更改'/'分辨率的工作方式。
搜索与给定类关联的资源的规则是 由类的定义类加载器实现。
对于基于Maven的项目,资源目录通常为src / main / resources。