2012-10-09 14 views
8

का उपयोग करते समय मैं इस वर्ग के पाश के लिए जल्दीजब Integer.MAX_VALUE की तुलना में और System.out.println

class Test { 

    public static void main(String[] args) { 
     int result = 0; 
     int end = Integer.MAX_VALUE; 
     int i; 
     for (i = 1; i <= end; i += 2) { 
      System.out.println(i); 
     } 
     System.out.println("End:" + i); 
    } 

} 

आउटपुट समाप्त करने के लिए लगता है चलाने है:

1 
3 
5 
... 
31173 
31175 
End:31177 

क्यों क्या यह वहां खत्म होता है? दिलचस्प बात यह है कि अगर मैंने लूप में System.out.println(i) हटा दिया, तो आउटपुट End:-2147483647 होगा। जाहिर है i में मान wrapped round है।

जावा संस्करण मैं उपयोग कर रहा हूँ

Java(TM) SE Runtime Environment (build 1.6.0_16-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode) 
+1

प्रिंटिंग Integer.MAX_VALUE –

+0

प्रिंट करने का प्रयास करें मुझे ऐसा आउटपुट नहीं मिल रहा है। ऐसा लगता है कि आपका बफर भरा हुआ है या कुछ। –

+2

कोड कभी भी प्रिंट प्रिंट नहीं करना चाहिए, एक बग भी है (हालांकि थोड़ा अलग है), आपके द्वारा लिखे गए लूप अनंत हैं, मैं हमेशा <= Integer.MAX_VALUE रहूंगा। – user439407

उत्तर

15

इसकी जावा 6. में एक ज्ञात बग JIT गलत तरीके से पाश अनुकूलित करता है। मेरा मानना ​​है कि जावा के हाल के संस्करणों में यह बग नहीं है।

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-wrong.html

जावा 6 अद्यतन 16 दो से अधिक साल पुराना है। मैं तुम्हें नवीनतम संस्करण में अपडेट जावा 6 अद्यतन 25 यदि आप जावा के लिए दो महीने में की नि: शुल्क सहायता समाप्ति अद्यतन नहीं कर सकते 7.

BTW जावा 6 हो जाएगा (दिसम्बर 2012)

+0

ग्रेट संसाधन। +1 –

+0

चीयर्स :) ..... –

+0

बहुत रोचक। मैं बस इसी तरह की खोज पोस्ट करने वाला था, सिवाय इसके कि मुझे वास्तव में इस असामान्य व्यवहार के मूल कारण को नहीं पता था। –

1

सुझाव है आप कर सकते हैं Integer.MAX_VALUE-1 का उपयोग कर JVM बग के आसपास काम करें।

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