getClass()getResource返回null

时间:2019-11-21 13:44:18

标签: java eclipse image nullpointerexception resources

当我尝试从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:空

我已经多次刷新,清理并构建了项目。

目录: enter image description here

知道为什么会这样吗?

谢谢

3 个答案:

答案 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_pa​​ckage_name / name
      其中Modifyed_pa​​ckage_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目录或更改'/'分辨率的工作方式。

  

搜索与给定类关联的资源的规则是   由类的定义类加载器实现。

来自Java documentation

对于基于Maven的项目,资源目录通常为src / main / resources。