ArrayIndexOutOfBoundsException在使用ArrayList的迭代器时

现在,我有一个包含一段代码的程序,如下所示:

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

我是否正确地做,只要迭代通过ArrayList去?

我得到的错误是:

 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

只要迭代Arraylist,我是否做得对?

否:在每次迭代中调用iterator两次,你总是得到新的迭代器。

编写这个循环的最简单方法是使用for-each构造:

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

至于

java.lang.ArrayIndexOutOfBoundsException: -1

你只是试图从数组中获取元素编号-1 。 计数从零开始。

虽然我同意接受的答案通常是最好的解决scheme,肯定更容易使用,但我注意到没有人显示正确使用迭代器。 所以这里是一个简单的例子:

 Iterator<Object> it = arrayList.iterator(); while(it.hasNext()) { Object obj = it.next(); //Do something with obj } 
 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)) 

当你确定这个值不是null或者你应该检查给定的元素是否为null。

你也可以这样使用:

 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 } 

你也可以为数组做一个for循环,而不是array [i],你可以使用list.get(i)

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

除了larsmans回答(谁的确是正确的),在调用get()方法中的exception,所以你发布的代码不是导致错误的代码。

有效的方法来迭代你的ArrayList然后是这个链接 。 这种types将改善迭代期间的循环性能

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

如果在迭代器创build后向元素添加元素,那么使用迭代器进行迭代不是自动防故障的,那么它会抛出并发修改exception。 此外它不是线程安全的,你必须使它线程安全的外部。

所以最好使用for循环的每个结构。 这是最安全的。