2015-06-09 9 views
19

मुझे जावा 8 सुविधाओं का उपयोग करते समय सेवा शुरू होने पर ArrayIndexOutOfBoundsException मिल रहा है (बीन सृजन)।जावा 8 का उपयोग करते समय बीन निर्माण पर ArrayOutOfBoundsException

जावा 8 स्थापित किया गया है और काम कर रहा है। कोड सही ढंग से संकलित करता है। सेवा शुरू होने पर, सेवा बंदरगाह को सुनने में विफल रहता है क्योंकि बीन्स नहीं बनते हैं। जब मैं कोड बदलता हूं (जावा 8 संरचनाओं को हटाता हूं) सेवा शुरू होती है और सब कुछ ठीक काम करता है। जावा 8 निर्माणों का उपयोग कर

for (Item itemObject : response) { 
    if (itemObject.hasId()) { 
     idList.add(String.valueOf(itemObject.Id()); 
    } 
} 

एक ही कोड:

response.parallelStream() 
     .filter(itemObject -> itemObject.hasId()) 
     .map(itemObject -> itemObject.getId()) 
     .forEach(id -> idList.add(id)); 

वर्ग इस युक्त के लिए सेम

इस कोड मैं उपयोग कर रहा हूँ (काम कर कोड, जिसके लिए सेवा शुरू होता है) है कोड स्कैन घटक स्कैन का उपयोग कर बनाया गया है।

निम्नलिखित जब दूसरी कोड ब्लॉक पहले एक के स्थान पर प्रयोग किया जाता है अपवाद संदेश है:

Exiting with throwable: java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace/.../GetContainerIdForFcSkuAdapter.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880 
java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace....Some.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880 

क्या मतलब नहीं है करने के लिए मुझे, क्यों एक समारोह के अंदर कोड है (जो बीन वर्ग के निर्माता नहीं) बीन बनाने के दौरान कवर किया जा रहा है। मैं यह पूछता हूं, क्योंकि जब मैं समानांतर धारा के बजाय लूप के लिए सामान्य का उपयोग करता हूं तो अपवाद नहीं होता है। ArrayOutOfBoundsException तब नहीं उठना चाहिए जब फ़ंक्शन कहा जाता है और यह कोड वास्तव में उपयोग किया जाता है।

मैं इसे कैसे ठीक करूं?

+2

'idList' क्या है? दूसरे संस्करण में आप 'समानांतर स्ट्रीम' का उपयोग कर रहे हैं ताकि आप इस सूची में कई धागे से आइटम जोड़ रहे हों। क्या सूची कार्यान्वयन है कि आप थ्रेड-सुरक्षित का उपयोग करते हैं? यदि आप समानांतर स्ट्रीम() 'के बजाय' stream() 'का उपयोग करते हैं तो त्रुटि गायब हो जाती है? – Jesper

+2

इसके अलावा, सूची में किसी स्ट्रीम की सामग्री प्राप्त करने का सामान्य तरीका 'stream सूची = stream.collect (collect.toList())' stream.forEach (o -> list.add (o) '' के बजाय 'है। – Jesper

+0

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

उत्तर

34

स्प्रिंग का कौन सा संस्करण आप उपयोग करते हैं? जावा 8 लैम्ब्डा एक्सप्रेशन का उपयोग करने के लिए आपको स्प्रिंग 4 में अपग्रेड करना होगा।

+1

हां, 4.0.X.RELEASE जावा के साथ काम करना 8. – Buminda

8

मुझे वसंत 3.0.5 का उपयोग करते समय हाल ही में एक बग मिला, जो 4.0.5 में तय किया गया प्रतीत होता है। यहाँ विवरण हैं।

यदि आपके पास ऐसी कक्षा है जिसमें पैरामीटरयुक्त कन्स्ट्रक्टर है और इसमें एक विधि भी है जो लैम्बडा अभिव्यक्ति (जावा 8 में पेश की गई) का उपयोग करती है, तो उस कक्षा के लिए एक बीन बनाते समय एक ArrayIndexOutOfException होता है।

+2

यह वास्तव में एक बग नहीं है। स्प्रिंग 3 पूरी तरह से जावा 8 का समर्थन नहीं करता है, इसलिए स्प्रिंग 3.0.5 के साथ लैम्ब्डा का उपयोग करना उपयोगकर्ता त्रुटि है और स्प्रिंग बग नहीं है। –

+2

मैं बस वें में भाग गया है और यह बहुत अजीब लग रहा था। जैसा कि आप कहते हैं, यह हुआ जब मैंने बीन के निर्माता को पैरामीटर जोड़ा। मैं कुछ स्थानों में प्रत्येक के लिए उपयोग कर रहा था। मुझे नहीं लगता कि मैंने कभी यह कनेक्शन बनाया होगा कि कक्षा में कहीं भी किसी भी सरणी सीमा अपवाद के साथ अपने बीन त्वरण को तोड़ देगा। ओह ठीक है - धन्यवाद, ढेर ओवरफ्लो! – botimer

+2

आपने मुझे एक दुःस्वप्न सिरदर्द से दूर कर दिया! धन्यवाद ! – Guillaume

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