2013-05-18 7 views
6

लूप के साथ खेलते समय नीचे कोड बनाया गया। नीचे दिया गया कोड Fibonacci मानों को एक सरणी में संग्रहीत करता है और फिर उन्हें लूप के लिए उपयोग करता है।लूप अपवाद

int [] numbers; 
    numbers = new int[25]; 

    numbers[0] = 1; 
    numbers[1] = 1; 
    System.out.println("Initializing the array values"); 

    for(int i = 2; i < numbers.length; i++) 
    { 
     numbers[i] = numbers[i-1] + numbers[i-2]; 
    } 

    System.out.println("Printing out Fibonacci values"); 

    for(int i = 0; i < numbers.length; i++) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

उपरोक्त कोड ठीक काम करता है। पहली बार मैंने इसे एक साथ फेंक दिया, हालांकि, मैंने मूल्यों को मुद्रित करने के लिए लूप के लिए बढ़ाया (कोड में लूप के लिए दूसरा)। यह ठीक संकलित करता है, लेकिन जब मैं इसे चलाता हूं तो मुझे निम्न मिलता है;

Initializing the array values 
Printing out Fibonacci values 
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34 
at ArrayDemo.main(ArrayDemo.java:21) 

मुझे क्या गलत नहीं मिला। दूसरे लूप को बदलने से मानों को नहीं बदला जाना चाहिए (आपको पता चलेगा कि फाइबोनैकी मान गलत हैं (यानी गायब मान))। और मुझे नहीं लगता कि लूप के लिए एक सरल वर्धित इंडेक्स को छोड़ देगा। अब, यह वास्तव में एक बड़ा सौदा नहीं है क्योंकि यह किसी प्रोजेक्ट या किसी भी चीज़ के लिए नहीं है, यह सिर्फ मुझे खराब करता है कि मैं यह नहीं समझ सकता कि यह क्यों कर रहा है। कोई सुराग?

लूप के लिए बढ़ाया गया बस इस तरह दिखता था;

for(int i : numbers) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

उत्तर

5
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

यहाँ i सरणी में तत्वों, नहीं अनुक्रमित है। यह numbers.length से बड़ा हो सकता है।

उदाहरण के लिए, यदि numbers = {1,2,3,9} तो i1, 2, 3, 9 हो जाएगा। लेकिन इसकी लंबाई 4 है, इसलिए जब आप इसके अंदर के तत्वों पर लूप करते हैं, तो आप numbers[9] करने की कोशिश कर रहे हैं जो इसके आकार से अधिक है।

आप शायद System.out.print(i + ", ");

+1

धन्यवाद। संक्षिप्त और समझने में आसान है। –

5

for(int i = 0; i <= numbers.length; i++)

for(int i = 0; i < numbers.length; i++)

जावा में होना चाहिए, सरणियों 0 आधारित अनुक्रमण कर रहे हैं। इसका मतलब है कि आपका पहला तत्व tab[2] या tab[tab.length-1] बुला, जो बराबर है से शून्य से 1.

int tab[] = new int[3]; //tab of length 3 
tab[0] = 11; 
tab[1] = 24; 
tab[2] = 5; 

यहाँ आप पिछले तत्व का उपयोग अपने सरणी की लंबाई में सूचकांक 0 पर एक्सेस किया जाना चाहिए और स्पष्ट रूप से पिछले।


क्षमा याचना, कि कोड मैं प्रश्न में डाल में बस एक गलती थी। System.out.print(i + ", "); आप this और this पाश के लिए बढ़ाया के बारे में पढ़ा जाना चाहिए:

समस्या यह है कि आपको क्या करना चाहिए है।

बयान को The भी संग्रह और सरणियों यह फार्म कभी कभी बयान के लिए बढ़ाया के रूप में जाना जाता है के माध्यम से यात्रा के लिए बनाया गया एक और रूप है, और अपने छोरों अधिक बनाने के लिए इस्तेमाल किया जा सकता कॉम्पैक्ट और पढ़ने में आसान।

class EnhancedForDemo { 
    public static void main(String[] args){ 
     int[] numbers = 
      {1,2,3,4,5,6,7,8,9,10}; 
     for (int item : numbers) { 
      System.out.println("Count is: " + item); 
     } 
    } 
} 

में:

int[] numbers = {1,2,3,4,5,6,7,8,9,10}; 

निम्नलिखित कार्यक्रम, EnhancedForDemo, सरणी लूप करने के लिए के लिए बढ़ाया का उपयोग करता है: प्रदर्शित करने के लिए निम्न सरणी है, जो संख्या रखती है 1 से 10 करने पर विचार इस उदाहरण में, परिवर्तनीय आइटम संख्या एरे से वर्तमान मान रखता है।

तो item संख्या सरणी से वर्तमान मूल्य और वर्तमान सूचकांक नहीं है। यही कारण है कि आपको IOOBE मिलता है।

+3

0 आधारित अनुक्रमण के बारे में त्वरित स्पष्टीकरण यह एक अच्छा जवाब देगा! – christopher

+0

क्षमाप्रार्थी, जो कोड में मैंने कोड में बस एक गलती की थी। यह पहली बार किया गया था। यह अभी भी व्याख्या नहीं करता है कि लूप के लिए बढ़ाया क्यों काम नहीं करता है। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न कोड संपादित किया है। –

2
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

करना चाहते

for(int i : numbers) 
    { 
     System.out.print(i + ", "); 
    } 

आप के लिए लूप बढ़ाया में अनुक्रमित उपयोग करने के लिए की जरूरत नहीं है होना चाहिए।