को लक्षित करना मैं आज एक बहुत ही अनपेक्षित त्रुटि में भाग गया और जब तक मैं पूरी तरह से समस्या को ठीक करने का कोई तरीका नहीं ढूंढ पाया, मुझे यकीन नहीं है कि मैं पूरी तरह समझता हूं कि ऐसा क्यों हुआ यह किया।जेडके 8 के साथ संकलित समवर्ती हैश मैप क्रैशिंग एप्लिकेशन लेकिन जेआरई 7
जिस कोड के साथ मैं काम कर रहा हूं वह मूल रूप से जेडीई 7 के लक्ष्यीकरण के जेडीके 7 पर्यावरण के साथ लिखा गया था। कोड में मैं ConcurrentHashMap
का उपयोग कर रहा था और मानचित्र में चाबियों को फिर से चलाने की आवश्यकता थी। इसके लिए मैं map.keySet()
का उपयोग कर रहा था जो जावाडॉक्स के अनुसार Set<K>
लौटा देना चाहिए। यह तब तक ठीक काम करता जब तक कि हमारे निर्माण पर्यावरण ने जेडीके 8 पर स्विच नहीं किया।
जब हम जेडीके 8 में चले गए तो मैंने सुनिश्चित किया कि मैं जावैक को कॉल करते समय 1.7 के लिए लक्ष्य/स्रोत कह रहा था। इसलिए जब मैं मानचित्र की चाबियों के माध्यम से पुन: प्रयास करना चाहता था तो कोड बहुत असफल रहा जब मैं बहुत आश्चर्यचकित था। कोई त्रुटि नहीं फेंक दी गई, कोई अपवाद नहीं, धागा बस बंद कर दिया। कुछ शोध करने के बाद मैंने पाया कि ConcurrentHashMap
.keySet()
विधि के लिए Java8 का कार्यान्वयन KeySetView<K,V>
देता है।
मैंने का उपयोग map.keys()
का उपयोग करके Enumeration<K>
प्राप्त करने से स्विच करके समस्या को ठीक किया।
अब मेरी समस्या यह है कि यद्यपि परियोजना को जावा 7 को लक्षित करने के लिए संकलित किया गया था क्योंकि जेडीके 8 का इस्तेमाल जावा 8 पुस्तकालयों में किया गया था, लेकिन जब यह मेल नहीं खाता तो यह त्रुटि या अपवाद क्यों नहीं फेंक दिया?
के रूप में यहां से पूछा एक कोड का टुकड़ा है:
class MapProcessing
{
private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<String, Object>();
public MapProcessing()
{
map.put("First",new Object());
map.put("Second",new Object());
map.put("Third",new Object());
}
public void processing()
{
// when calling this type of loop causes a freeze on our system.
for(String key : map.keySet())
{
System.out.println(key);
}
}
public void working()
{
// This is what I had to do to fix the problem.
Enumeration<String> keys = map.keys();
while(keys.hasMoreElements())
{
String key = keys.nextElement();
System.out.println(key);
}
}
}
हम ओरेकल JDK 8 निर्माण 40 का उपयोग कर एक Windows 2012 सर्वर पर 1.7 के लिए एक लक्ष्य और javac में स्रोत 1.7 का उपयोग कर संकलन कर रहे हैं।
यह कोड विंडोज 2012 सर्वर पर चल रहे ओरेकल जेवीएम 7 बिल्ड 25 का उपयोग कर चल रहा है।
क्या आपने जेडीके 8 को जोड़ने के बाद इसे साफ करने का प्रयास किया? –
@ सुरेश बिल्ड बिल्डिंग एक जेनकींस है। जब हम जेडीके 8 में चले गए तो हमने वर्कस्पेस हटा दिया और फिर एक नया निर्माण किया। इसका मतलब यह होगा कि कोड को एसवीएन से ताजा चेक किया गया था और फिर बनाया गया था। मुझे यकीन नहीं है कि मानक कॉल के अलावा चींटी को "साफ" लक्ष्य में एंटी में छोड़कर इसका मतलब क्या है, जो होता है। – JRSofty
क्या आप एक कोड स्निपेट और सटीक जेवीएम संस्करण और विक्रेता + ओएस पोस्ट कर सकते हैं? KeySetView लागू लागू करें, इसलिए कम से कम यह वास्तव में एक समस्या नहीं होनी चाहिए –
salyh