IndexOutOfBoundsException异常

use*_*221 2 java exception

嗨,此代码将返回indexoutofboundsException,我真的不知道为什么?我想删除那些与pointlist其中的对象相同的对象list.

    public void listOfExternalPoints(List<Point> list) {
    System.out.println(list.size());
    System.out.println(pointList.size());
    int n = pointList.size();
    for (int i = pointList.size() - 1; i >= 0; i--) {
        for (int j = 0; j < list.size(); j++) {
            if (pointList.get(i)==(list.get(j))) {
                pointList.remove(i);
                n--;
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

println的输出也将是:

54
62
Run Code Online (Sandbox Code Playgroud)

也是例外:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 60, Size: 60
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at ConvexHull.BlindVersion.listOfExternalPoints(BlindVersion.java:83)
Run Code Online (Sandbox Code Playgroud)

谢谢.

sch*_*eld 10

嘿,你从列表中删除了一些元素.因此列表小于循环开始时的列表.

我建议你用:

pointList.removeAll(list)
Run Code Online (Sandbox Code Playgroud)

或者是迭代器.


sho*_*639 6

当你这样做时pointList.remove(i),你应该脱离内循环.否则,它会尝试pointList.get(i)在循环的下一次迭代中再次索引你刚刚删除的索引,这就是为什么你得到了异常.

当arrayLists删除元素时,将取出该元素,并将其后的所有元素向下移动.因此,如果删除索引3并且只有4个元素,则新的arrayList只有3大小,并且您尝试获取索引3,这是超出范围的.

编辑:更好的方法是:

for(Point p : list) {
    pointList.remove(p);
}
Run Code Online (Sandbox Code Playgroud)

它会有相同的效率,但我认为更正确.请记住,==比较同一对象的引用.remove方法使用.equals检查是否相等,这就是我想要的.