2014-05-14 3 views
5

के परिणामस्वरूप पुनरावृत्ति करते समय अजीब एनपीई मुझे लगता है कि निम्नलिखित कोड सुरक्षित है, फिर भी मुझे hasMoreElements() का आह्वान करते समय एनपीई मिल रहा है। कोई अंदाज़ा कि क्या गलत हो सकता है?क्लासलोडर.getResources()

मुझे यह जोड़ना चाहिए कि मैं जावा, 64 बिट पर जावा 1.7.0_55-b13 का उपयोग कर रहा हूं।

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); 
    } 
} 

स्टैक ट्रेस: ​​

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) 
    .... 
+1

में तय किया गया है समस्या नहीं है कि 'urlsEn' मान शून्य होगा - एनपीई ढेर नीचे फेंक दिया जाता है तो यह एक तरह लग रहा है बग .. – assylias

+0

आपके थ्रेड संदर्भ वर्ग लोडर का प्रकार क्या है? –

उत्तर

1

मेरा सुझाव के लिए अपनी समस्या इतना आसान कुछ है नफरत है, लेकिन pluginsUrinull यहाँ हो सकता है? कम से कम अपने कोड स्निपेट में, आप plUri चर बनाते हैं लेकिन फिर एक unmentioned pluginsUri से ClassLoader.getResources() में पास करते हैं।

अपने स्टैक ट्रेस से, "URLClassPath शून्य सूचक अपवाद" की खोज this question जो एक ही स्टैक ट्रेस होने लगती है। उनके मामले में getResources() का तर्क स्पष्ट रूप से शून्य है।

Java 7 codebase को देखते हुए, हम देखते हैं MetaIndex:243 है कि:

if (entry.startsWith(conts[i])) { 

और entry इस लाइन पर null हो सकता है। स्टैक को ऊपर देखकर, entryname तर्क है जो आपने 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()); 
    } 
} 

(जावा 8 में, कम नहीं) अपने स्टैक ट्रेस replicates:

$ 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) 

JDK निर्दिष्ट क्या होता अगर namenull है प्रकट नहीं होता है। मैंने इस व्यवहार को ठीक करने का सुझाव देने के लिए एक बग दायर किया है, या कम से कम दस्तावेज़ीकरण को स्पष्ट किया है। अगर ओरेकल इस मुद्दे को स्वीकार करता है तो मैं इस पोस्ट को अपडेट करूंगा।

अद्यतन: रिपोर्ट JDK-8136831 ट्रैक होने, और जावा 9.

+0

@ntoskrnl अपडेट के लिए धन्यवाद! – dimo414