2014-10-22 17 views
5

मुझे अभी बहुत अजीब NullPointerException मिला है। सबसे पहले, मैं बनाने के एक NumberFormat इस तरह (ध्यान दें कि डिफ़ॉल्ट Locale जर्मनी हो सकता है, कि अगर मदद करता है मैं नहीं जानता):NumberFormat.format क्यों एक NullPointerException फेंक देता है?

NumberFormat angleFormat = NumberFormat.getNumberInstance(Locale.UK); 
angleFormat.setMaximumFractionDigits(5); 
angleFormat.setMinimumFractionDigits(0); 

फिर, मैं इसके साथ एक डबल फ़ॉर्मेट करने के लिए कोशिश की। यह एक लैम्ब्डा द्वारा बनाई गई एक नई थ्रेड के साथ किया जाता है, जबकि angleFormat लैम्ब्डा युक्त विधि में घोषित किया जाता है। कोड जहां अपवाद फेंक दिया जाता है इस प्रकार है:

con.println("D" + moveId + (state.isEnemyInSightOf(e) ? "+" : "-") 
     + angleFormat.format(e.getAngle()) // line 123 - error is here 
     + (state.isMissileInSightOf(e) ? "+" : "-") 
     + angleFormat.format(e.getSight()) 
     + (e.getLastShot() >= 10 || e.getLastShot() <= -1 ? "+" : "-") 
     + angleFormat.format(e.getLives())); 

e.getAngle() रिटर्न एक double, तो यह शून्य वापस नहीं लौट सकते। हालांकि, मैं इस अपवाद प्राप्त करें:

Exception in thread "Thread-1" java.lang.NullPointerException 
    at java.text.DecimalFormat.fastDoubleFormat(Unknown Source) 
    at java.text.DecimalFormat.fastFormat(Unknown Source) 
    at java.text.NumberFormat.format(Unknown Source) 
    at server.game.Simulator.lambda$0(Simulator.java:123) 
    at server.game.Simulator$$Lambda$3/23162747.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

मुझे यकीन है कि e अपवाद के स्टैकट्रेस की वजह से रिक्त नहीं है कर रहा हूँ, यह एक) एक पंक्ति पहले फेंक दिया जाएगा और ख) java.text.DecimalFormat.fastDoubleFormat

नहीं पर

क्यों NullPointerException बीइंग कभी-कभी फेंक दिया जाता है, और कभी-कभी यह बिना किसी समस्या के काम करता है? और उसका क्या मतलब है? त्रुटि पुन: उत्पन्न होने लगती है, लेकिन अक्सर नहीं।

+0

वह 123 पंक्ति क्या है? –

+4

'" नलपोइंटर एक्सेप्शन कभी-कभी फेंक दिया जाता है, और कभी-कभी यह बिना किसी समस्या के काम करता है? और इसका क्या मतलब है? "- यह अंतराल त्रुटि थ्रेडिंग मुद्दे की गंध करता है। क्या यह एक जीयूआई है? क्या आप अपने कोड के थ्रेडिंग से सावधान हैं? –

+1

क्या आप निश्चित हैं कि 'ई' स्वयं 'शून्य' नहीं है? – Mureinik

उत्तर

4

टिप्पणियों से: मैं प्रत्येक में एक अलग e लेकिन एक ही NumberFormat

यह रुक-रुक कर मुद्दों है कि अपने कोड सामना कर रहा है के स्रोत प्रतीत होता है के साथ एक पाश में धागे पैदा करते हैं। documentation of NumberFormat के अनुसार, वर्ग धागा सुरक्षित नहीं है, तो समवर्ती पहुँच बाह्य सिंक्रनाइज़ किया जाना चाहिए:

संख्या स्वरूपों आम तौर पर सिंक्रनाइज़ नहीं कर रहे हैं। प्रत्येक थ्रेड के लिए अलग प्रारूप उदाहरण बनाने की अनुशंसा की जाती है। यदि एकाधिक थ्रेड एक प्रारूप को एक साथ एक्सेस करते हैं, तो इसे बाहरी रूप से सिंक्रनाइज़ किया जाना चाहिए।

1

JavaDoc से DecimalFormat के लिए

तुल्यकालन

दशमलव प्रारूपों आम तौर पर सिंक्रनाइज़ नहीं कर रहे हैं। प्रत्येक थ्रेड के लिए अलग प्रारूप उदाहरण बनाने की अनुशंसा की जाती है। यदि एकाधिक थ्रेड एक प्रारूप को एक साथ एक्सेस करते हैं, तो इसे बाहरी रूप से सिंक्रनाइज़ किया जाना चाहिए।

वैसे, जावा का कौन सा संस्करण यह है? मुझे जावा 6 या 7 के लिए दस्तावेज़ों में DecimalFormat.fastFormat() विधि नहीं दिखाई देती है।

+0

चूंकि मैंने इस सवाल में उल्लेख किया है कि मैं लैम्बडास का उपयोग करता हूं, मैं जावा 8 का उपयोग कर रहा हूं – msrd0

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