为什么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
传递给getResource
的path
变量的值为"/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_package_name / name其中modified_package_name是此对象的包名称,其中’/’替换为’。’ ( ‘\ u002e’)。