जेएलएस के अनुसार, एक int
सरणी को आरंभीकरण के ठीक बाद शून्य से भरना चाहिए। हालांकि, मैं एक ऐसी स्थिति से सामना कर रहा हूं जहां यह नहीं है। ऐसा व्यवहार पहले JDK 7u4 में होता है और बाद के सभी अपडेट में भी होता है (मैं 64-बिट कार्यान्वयन का उपयोग करता हूं)। निम्नलिखित कोड अपवाद फेंकता है:
public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
JVM कोड ब्लॉक का संकलन करने और -Xint
झंडे के साथ उत्पन्न नहीं होने के बाद अपवाद होता है । इसके अतिरिक्त, Arrays.fill(...)
कथन (इस कोड में अन्य सभी कथन) आवश्यक है, और अनुपस्थित होने पर अपवाद नहीं होता है। यह स्पष्ट है कि यह संभव बग कुछ JVM ऑप्टिमाइज़ेशन से घिरा हुआ है। इस तरह के व्यवहार के कारण के लिए कोई विचार?
अद्यतन:
मैं हॉटस्पॉट 64-बिट सर्वर VM, जावा संस्करण 1.7.0_04 से 1.7.0_10 पर Gentoo लिनक्स, डेबियन लिनक्स (दोनों कर्नेल 3.0 संस्करण) और MacOS शेर पर इस व्यवहार को देखता हूं। यह त्रुटि हमेशा ऊपर दिए गए कोड के साथ पुन: प्रस्तुत की जा सकती है। मैंने 32-बिट JDK के साथ या विंडोज पर इस समस्या का परीक्षण नहीं किया। मैंने पहले ही Oracle (बग आईडी 7196857) को एक बग रिपोर्ट भेज दी थी और यह कुछ दिनों में सार्वजनिक Oracle बग डेटाबेस में दिखाई देगा।
अद्यतन:
Oracle ने इस बग को अपने सार्वजनिक बग डेटाबेस में प्रकाशित किया: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857