为什么class.getResource()会继续返回null,尽管指定路径上有资源?

时间:2015-03-23 19:58:33

标签: java eclipse class getresource

我想知道为什么方法getResource不断返回null,我有以下设置:

public static URL getResource(String path){
    URL url = ResourceLoader.class.getResource(path);
    if (Parameters.DEBUG){
        System.out.println(path);
    }
    return url;
}

Eclipse中的项目结构如下:

-- res
  -- img

我传递给path的{​​{1}}变量的值为getResource"/res/img"。然而,该方法不断返回"/res/img/smile.png"并且未设置null。我还按照this question的说明,通过运行配置将文件夹添加到项目的类路径中,仍未成功...有谁知道我做错了什么?

enter image description here

2 个答案:

答案 0 :(得分:5)

简答:使用"/img/smile.png"

实际发生的是,任何以/开头的路径都被视为相对于类路径中的每个条目。

如屏幕截图所示,res目录就是这样的类路径条目。因此,Class.getResource方法将您提供的路径视为相对于该条目。含义,相对于res目录。

因此,该方法将您的字符串参数与该目录相结合,从而产生res/res/img/smile.png。由于该位置不存在文件(资源),因此返回null。

答案 1 :(得分:1)

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)

  

搜索与给定类关联的资源的规则是   由类的定义类加载器实现。这种方法   委托给这个对象的类加载器。如果加载此对象   引导类加载器,该方法委托给   ClassLoader.getSystemResource(java.lang.String中)。在授权之前,   绝对资源名称是从给定的资源名称构造的   使用这个算法:

     

如果名称以'/'('\ u002f')开头,则绝对名称为   资源是'/'后面的名称部分。

     

否则,绝对名称的格式如下:   modified_pa​​ckage_name / name其中modified_pa​​ckage_name是   这个对象的包名称用'/'代替'。' ( '\ u002e')。