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

我想知道为什么方法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 

传递给getResourcepath变量的值为"/res/img""/res/img/smile.png" 。 然而,该方法保持返回null并且未设置url 。 我也按照这个问题的说明,通过运行配置将文件夹添加到项目的类路径中 ,仍然没有成功……有谁知道我做错了什么?

在此处输入图像描述

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

实际发生的是,任何以/开头的路径都被赋予Class.getResource方法,它总是被视为相对于类路径中的每个条目。

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

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

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’)。