使用ArrayList的迭代器时ArrayIndexOutOfBoundsException

Thi*_*mer 102 java iterator arraylist indexoutofboundsexception

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

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

我是否正确,只要迭代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)
Run Code Online (Sandbox Code Playgroud)

我会显示其余的代码,但它非常广泛,如果我没有正确地进行迭代,我会假设唯一的可能性是我没有ArrayList正确初始化.

Fre*_*Foo 228

我是否正确,只要反复通过Arraylist去了?

不:通过iterator在每次迭代中调用两次,您将始终获得新的迭代器.

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

for (String s : arrayList)
    if (s.equals(value))
        // ...
Run Code Online (Sandbox Code Playgroud)

至于

java.lang.ArrayIndexOutOfBoundsException: -1

您刚刚尝试-1从数组中获取元素编号.计数从零开始.

  • @naxa:它可能会以居高临下的方式过来,我改变了措辞. (3认同)
  • 需要注意的是,"你听说过吗?"似乎有些令人反感(无缘无故),但我不是本地人.不然很好. (2认同)

Nem*_*X00 141

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

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

  • 我觉得这更准确地回答了这个问题,因为它是一个迭代器示例而不是替代解决方案. (12认同)

zac*_*usz 37

List<String> arrayList = new ArrayList<String>();
for (String s : arrayList) {
    if(s.equals(value)){
        //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

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

但要小心ArrayList可以保存空值.所以比较应该是

value.equals(arrayList.get(i))
Run Code Online (Sandbox Code Playgroud)

当您确定该值不为null或您应该检查给定元素是否为null.


sub*_*bbu 10

你也可以像这样使用:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = iterator.next();
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)

它是一个很好的实践来投射和使用对象.例如,如果'arrayList'包含'Object1'对象的列表.然后,我们可以重新编写代码:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = (Object1) iterator.next();
//do some stuff
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*aro 8

您也可以像对数组一样进行for循环,但是使用list.get(i)而不是数组[i]

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}
Run Code Online (Sandbox Code Playgroud)


SJu*_*n76 7

除了larsmans回答(谁确实是正确的),调用get()方法时的异常,因此您发布的代码不是导致错误的代码.


归档时间:

查看次数:

393100 次

最近记录:

9 年,6 月 前