use*_*051 6 java nullpointerexception classloader
我假设下面的代码是安全的,但是我在调用时得到了一个NPE hasMoreElements().什么想法可能是错的?
我应该补充一点,我在Windows上使用Java 1.7.0_55-b13,64位.
final List<URL> urls = new ArrayList<URL>();
final String plUri = "META-INF/plugin.xml";
Enumeration<URL> urlsEn =
Thread.currentThread().getContextClassLoader().getResources(pluginsUri);
if (urlsEn != null) {
while (urlsEn.hasMoreElements()) { // NPE happens here
final URL u = urlsEn.nextElement();
urls.add(u);
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
java.lang.NullPointerException
at sun.misc.MetaIndex.mayContain(MetaIndex.java:243)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:830)
at sun.misc.URLClassPath$2.next(URLClassPath.java:273)
at sun.misc.URLClassPath$2.hasMoreElements(URLClassPath.java:283)
at java.lang.ClassLoader$2.hasMoreElements(ClassLoader.java:1322)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at com.github.jochen.afw.core.guice.GuiceComponentFactoryBuilder.getComponentUrls(GuiceComponentFactoryBuilder.java:256)
at com.github.jochen.afw.core.guice.GuiceComponentFactoryBuilder.build(GuiceComponentFactoryBuilder.java:160)
at com.github.jochen.afw.core.guice.GuiceComponentFactoryBuilderTest.testSuccessfullConfiguration(GuiceComponentFactoryBuilderTest.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
....
Run Code Online (Sandbox Code Playgroud)
我不想说你的问题是如此简单,但可能pluginsUri在null这里吗?至少在您的代码片段中,您创建了一个plUri变量,但随后传入了一个未提及的pluginsUrito ClassLoader.getResources()。
从您的堆栈跟踪中,搜索“URLClassPath 空指针异常”发现了这个问题,它看起来是相同的堆栈跟踪。在他们的例子中, 的论点getResources()显然是无效的。
查看Java 7 代码库,我们看到MetaIndex:243:
if (entry.startsWith(conts[i])) {
Run Code Online (Sandbox Code Playgroud)
并且entry可能null在这条线上。查看堆栈的较高位置,entry看起来是name您传递给 的参数ClassLoader.getResources()。
本次SSCCE:
public class ClassLoaderNPE {
public static void main(String[] args) throws IOException {
Enumeration<URL> urls = ClassLoader.getSystemClassLoader().getResources(null);
System.out.println(urls.hasMoreElements());
}
}
Run Code Online (Sandbox Code Playgroud)
复制您的堆栈跟踪(在 Java 8 中也同样如此):
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
$ java -cp . ClassLoaderNPE
Exception in thread "main" java.lang.NullPointerException
at sun.misc.MetaIndex.mayContain(MetaIndex.java:242)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:995)
at sun.misc.URLClassPath$2.next(URLClassPath.java:288)
at sun.misc.URLClassPath$2.hasMoreElements(URLClassPath.java:298)
at java.lang.ClassLoader$2.hasMoreElements(ClassLoader.java:1278)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at ClassLoaderNPE.main(ClassLoaderNPE.java:9)
Run Code Online (Sandbox Code Playgroud)
JDK没有出现指定如果是的话会发生什么。我已经提交了一个错误,建议修复此行为,或者至少澄清文档。如果/当 Oracle 接受该问题时,我将更新这篇文章。namenull
更新:该报告被跟踪为JDK-8136831,并已在 Java 9 中修复。