2009-12-06 9 views
7

मेरे सैकड़ों उपयोगकर्ताओं में से एक और केवल मेरे जावा डेस्कटॉप ऐप को शुरू करने में परेशानी है। यह केवल उसके लिए एक तिहाई समय के लिए शुरू होता है। समय एक NullPointerException स्टार्टअप पर फेंक दिया जाता है के अन्य दो तिहाई:मैं इस जावा संदर्भ क्लासलोडर समस्या को सुरक्षित रूप से कैसे हल कर सकता हूं?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at java.util.Hashtable.put(Hashtable.java:394) 
    at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1327) 
    at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1309) 
    at javax.swing.JEditorPane.loadDefaultKitsIfNecessary(JEditorPane.java:1387) 
    at javax.swing.JEditorPane.getKitTypeRegistry(JEditorPane.java:1344) 
    at javax.swing.JEditorPane.getEditorKitClassNameForContentType(JEditorPane.java:1340) 
    at javax.swing.JTextPane.<init>(JTextPane.java:76) 
    at myapp.Launcher$1.run(Launcher.java:13) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

मैं स्टैक ट्रेस का पालन किया है कारण यह है कि

Thread.currentThread().getContextClassLoader() 
JEditorPane में

अशक्त लौट जाता है कि खोजने के लिए।

गुगलिंग से पता चलता है कि यह एक छद्म, बहुत कम, और रहस्यमय समस्या है जो कुछ लोगों को प्रभावित करती है।

मेरा सवाल है, मैं काम के आसपास के रूप में क्या कर सकता हूं? यह काम हो सकता है, अगर मैं इसे कहते एक EditorPane बनाने से पहले:

Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader()); 

लेकिन मैं सच में समझ में नहीं आता classloaders के साथ-साथ मैं चाहते हैं (और मैं उन्हें बेहतर समझने के लिए कोशिश की है)। मुझे लगता है कि EDT में संदर्भ क्लासलोडर को बदलने से खराब विधियां हो सकती हैं।

कोई विचार मैं क्या कर सकता हूं?

संपादित करें: मेरे पास जावा क्लासलोडर्स को अच्छी तरह से समझने वाले किसी के साथ कुछ पत्राचार था। ऐसा लगता है कि यह एक अस्पष्ट क्लासलोडर दौड़ की स्थिति है। यही है, जावा में एक बग।

+0

उपयोगकर्ता के जावा रनटाइम उन्नत करने के लिए किसी भी मौका? –

+0

@ तामास, यह एक मैक ऐप है। मैंने उसे नवीनतम मैक जावा अपडेट करने का प्रयास करने के लिए कहा। –

उत्तर

4
Thread.currentThread().getContextClassLoader() 

JEditorPane.registerEditorKitForContentType के कोड से ऊपर कोड में एक अशक्त वापसी मान की जाँच नहीं करता है, तो यह JEditorPane में एक बग है। ध्यान दें कि MyClass.class.getClassLoader()may also return null। केवल एक ही जिस पर आप भरोसा कर सकते हैं वह system ClassLoader है।

एक मंगलाचरण के लिए संदर्भ ClassLoader स्थापित करने के लिए पैटर्न आम तौर पर इस तरह दिखता है:

Thread thread = Thread.currentThread(); 
ClassLoader old = thread.getContextClassLoader(); 
thread.setContextClassLoader(fooClassLoader); 
try { 
    // do call that depends on context ClassLoader 
} finally { 
    thread.setContextClassLoader(old); 
} 

मूल्य setContextClassLoader के माध्यम से स्थापित किया जाना चाहिए कि कोड की मंशा है कि यह और डिजाइन लेने पर निर्भर करेगा । ClassLoader ढांचे के आप में चल रहे हैं

एक स्टैंड-अलोन आवेदन में, आप शायद सिर्फ इस ClassLoader का उपयोग कर (वर्तमान वर्ग के लिए एक रेफरी में गुजर) के साथ प्राप्त कर सकते हैं:

private ClassLoader findClassLoaderForContext(Class<?> c) { 
    ClassLoader context = Thread.currentThread().getContextClassLoader(); 
    ClassLoader me = c.getClassLoader(); 
    ClassLoader system = ClassLoader.getSystemClassLoader(); 
    return (context == null) ? (me == null) ? system : me : context; 
} 

क्लासलोडर-संवेदनशील प्लग-इन फ्रेमवर्क (जावा ईई सर्वर एक प्रमुख उदाहरण होगा) में, यह लोडिंग योजना की प्रकृति और उपयोग को समझने के लिए भुगतान करेगा।

+0

मैंने उस आवेषण के लिए संदर्भ क्लासलोडर सेट करने के लिए आपके द्वारा दिए गए पैटर्न की कोशिश की। मुझे यह पसंद है क्योंकि यह संदर्भ क्लासलोडर के अन्य उपयोगों के लिए संभावित रूप से चीजों को खराब नहीं करता है। –

संबंधित मुद्दे

 संबंधित मुद्दे