ArrayIndexOutOfBoundsException ArrayList के इटरेटर का उपयोग करते समय


103

अभी, मेरे पास एक प्रोग्राम है जिसमें कोड का एक टुकड़ा है जो इस तरह दिखता है:

while (arrayList.iterator().hasNext()) {
     //value is equal to a String value
     if( arrayList.iterator().next().equals(value)) {
          // do something 
     }
}

क्या मैं वह अधिकार कर रहा हूं, जहां तक ​​ऐरेलेस्ट के माध्यम से पुनरावृति होती है?

मुझे जो त्रुटि मिल रही है, वह है:

java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(Unknown Source)
    at main1.endElement(main1.java:244)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at main1.traverse(main1.java:73)
    at main1.traverse(main1.java:102)
    at main1.traverse(main1.java:102)
    at main1.main(main1.java:404)

मैं बाकी कोड दिखाऊंगा, लेकिन यह बहुत व्यापक है, और यदि मैं सही ढंग से पुनरावृत्ति नहीं कर रहा हूं, तो मैं केवल यह मानूंगा कि मैं ArrayListठीक से प्रारंभ नहीं कर रहा हूं ।


Java 8 में आप इस forEachविधि का उपयोग कर सकते हैं : stackoverflow.com/questions/16635398/…
Vitalii Fedorenko

जवाबों:


229

क्या मैं वह अधिकार कर रहा हूँ, जहाँ तक Arraylist के माध्यम से चलना है?

नहीं: iteratorप्रत्येक पुनरावृति में दो बार कॉल करने से , आपको हर समय नए पुनरावृत्तियों मिल रहे हैं।

इस लूप को लिखने का सबसे आसान तरीका प्रत्येक निर्माण के लिए है:

for (String s : arrayList)
    if (s.equals(value))
        // ...

से संबंधित

java.lang.ArrayIndexOutOfBoundsException: -1

आपने बस -1एक सरणी से तत्व संख्या प्राप्त करने का प्रयास किया है । मतगणना शून्य से शुरू होती है।


1
प्रत्येक के लिए उपयोग करें, यह बहुत आसान है। इसके अलावा यह संभव है कि आप arrayList.iterator ()। Next () फिर से और स्किप की गई प्रविष्टियाँ कहें।

@ लार्समैन आह आपको बहुत बहुत धन्यवाद। मैं पूरी तरह से भूल गया कि आप सरणी सूची के साथ ऐसा कर सकते हैं। हालाँकि, मैंने कोशिश की कि मेरे कोड के साथ, और मुझे अभी भी वही त्रुटि मिल रही है। इसलिए मुझे लगता है कि यह एक समस्या है कि मैं कोड में पहले से कैसे जोड़ रहा हूं, इसलिए अब मैं उस पते को देखूंगा। फिर भी, मुझे उस बारे में याद दिलाने के लिए बहुत-बहुत धन्यवाद।
यह 1

प्यार है कि प्रत्येक ऑपरेटर के लिए। मैं हर समय रूबी में इसका उपयोग करता हूं ... do array.each |s| unless (s.nil?) end end
डेविड वेस्ट

2
बस ध्यान देने के लिए, Have you heard ofआपत्तिजनक लगता है (बिना किसी कारण के), लेकिन मैं मूल निवासी नहीं हूं। अन्यथा महान।
n611x007 12

3
@naxa: यह कृपालु के रूप में आ सकता है, मैंने शब्दांकन बदल दिया है।
फ्रेड फू

142

हालांकि मैं मानता हूं कि स्वीकृत उत्तर आमतौर पर सबसे अच्छा समाधान है और निश्चित रूप से उपयोग करने में आसान है, मैंने देखा कि किसी ने पुनरावृत्ति के उचित उपयोग को प्रदर्शित नहीं किया है। तो यहाँ एक त्वरित उदाहरण है:

Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
    //Do something with obj
}

12
मुझे लगता है कि यह अधिक सटीक रूप से प्रश्न का उत्तर देता है, क्योंकि यह वैकल्पिक समाधान के बजाय एक पुनरावृत्त उदाहरण है।
१५:१३

1
आपको अपनी सुखद प्रतिक्रिया के लिए धन्यवाद। (...) पुनरावृत्ति आम तौर पर सबसे अच्छा समाधान है, लेकिन हमेशा नहीं। आज, मैं स्पष्ट रूप से प्रबंधित इट्रेटर सिंटैक्स की तलाश में होना चाहता हूं और यहां यह है।
रॉबर्ट ऑल्टमैन

37
List<String> arrayList = new ArrayList<String>();
for (String s : arrayList) {
    if(s.equals(value)){
        //do something
    }
}

या

for (int i = 0; i < arrayList.size(); i++) {
    if(arrayList.get(i).equals(value)){
        //do something
    }
}

लेकिन लापरवाह ArrayList अशक्त मूल्यों को धारण कर सकते हैं । तो तुलना होनी चाहिए

value.equals(arrayList.get(i))

जब आप सुनिश्चित हों कि मूल्य शून्य नहीं है या आपको जांचना चाहिए कि दिया गया तत्व शून्य है या नहीं।


10

आप इस तरह का भी उपयोग कर सकते हैं:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = iterator.next();
//do some stuff
}

वस्तु को डालना और उसका उपयोग करना एक अच्छा अभ्यास है। उदाहरण के लिए, यदि 'arrayList' में 'Object1' ऑब्जेक्ट की सूची है। फिर, हम कोड को फिर से लिख सकते हैं:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = (Object1) iterator.next();
//do some stuff
}

8

आप किसी लूप के लिए भी कर सकते हैं जैसा कि आप किसी ऐरे के लिए करेंगे, लेकिन एरे [i] के बजाय आप लिस्ट का उपयोग करेंगे। (i)

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

7

लार्समैन के जवाब के अलावा (जो वास्तव में सही है), कॉल टू ए गेट () विधि में अपवाद है, इसलिए आपके द्वारा पोस्ट किया गया कोड वह नहीं है जो त्रुटि पैदा कर रहा है।


4

ArrayListइस लिंक द्वारा आपके द्वारा पुनरावृति करने का कुशल तरीका । यह प्रकार पुनरावृत्ति के दौरान लूपिंग के प्रदर्शन में सुधार करेगा

int size = list.size();

for(int j = 0; j < size; j++) {
    System.out.println(list.get(i));
}

2

इटरेटर का उपयोग करते हुए पुनरावृत्ति करना विफल नहीं है उदाहरण के लिए यदि आप इटरेटर के निर्माण के बाद संग्रह में तत्व जोड़ते हैं तो यह समवर्तीmionaionexception फेंक देगा। इसके अलावा यह थ्रेड सेफ नहीं है, आपको इसे थ्रेड को बाहरी रूप से सुरक्षित बनाना होगा।

इसलिए लूप के लिए प्रत्येक संरचना के लिए उपयोग करना बेहतर है। यह कम से कम असफल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.