我写了以下简单的程序:
public class Test {
public static void main(String[] args) throws IOException {
System.out.println(get(Test.class.getResource("/c.conf"))); //fine
System.out.println(
get(Test.class.getClassLoader().getResource("/c.conf"))
); //NPE, Test.class.getClassLoader().getResource("/c.conf") returns null
}
public static String get(URL url) throws IOException {
InputStreamReader reader = new InputStreamReader(url.openStream());
StringBuilder sb = new StringBuilder();
int current;
while ((current = reader.read()) != -1)
sb.append((char) current);
return sb.toString();
}
}
所以,我查看Class::getResource(String)
的{{3}}并发现了这个:
搜索与给定类关联的资源的规则是 由类的定义类加载器实现。
所以我认为这两种方法应该以相同的方式加载资源。
为什么Test.class.getClassLoader().getResource("/c.conf")
抛出NullPointerException
而Test.class.getResource("/c.conf")
没有?