【发布时间】:2015-05-02 13:34:31
【问题描述】:
我无法理解这一点,所以我希望你们能很好地解释为什么这段代码不起作用。
我的Warehouse 类中有一个ArrayList 或Point。
这段代码可以正常工作(它在另一个类中,而不是Warehouse):
Point lastPoint = new Point(0, 0);
ArrayList<Point> localPackages = this.warehouse.getPackages();
while(true){
if(localPackages.size() > 0){
lastPoint = this.determineClosest(lastPoint, localPackages);
routeTemp.add(lastPoint);
localPackages.remove(localPackages.indexOf(lastPoint));
}else{
break;
}
}
但是 Warehouse 类中的包因为被删除而消失了。所以我尝试复制变量并在本地使用它,但我对此并不满意。
ArrayList<Point> localPackages = new ArrayList<>(this.warehouse.getPackages());
这是我收到的错误:
Exception in thread "AWT-EventQueue-0"
java.lang.ArrayIndexOutOfBoundsException: -1
我在这一行得到了那个错误:
localPackages.remove(localPackages.indexOf(lastPoint));
这是localPackages 变量的打印结果:
[
java.awt.Point[x=1,y=1],
java.awt.Point[x=1,y=4],
java.awt.Point[x=2,y=0],
java.awt.Point[x=4,y=3],
java.awt.Point[x=0,y=1],
java.awt.Point[x=0,y=4],
java.awt.Point[x=1,y=0],
java.awt.Point[x=4,y=2]
]
那么为什么我在复制变量时得到ArrayIndexOutOfBoundsException,而在使用原始变量时却没有?
【问题讨论】:
-
如果
localPackages不包含lastPoint,你会期望发生什么? -
indexOf 如果未找到该元素,则返回 -1。可能想打印出 lastPoint 作为支票...
-
@JonSkeet 和 nneonneo,很好。但是我忘了把那段代码复制到。所以这不是问题。问题是它是完全相同的代码,但是复制变量不起作用,而“正常”的代码却可以。
-
“所以这不是问题。”是的。您正在调用
remove,索引为-1,如果indexOf返回-1,您将得到该值,如果该值不在集合中,它将返回该值。您为什么不向我们展示一个简短但完整的程序来演示问题,但您认为它应该可以工作? (顺便说一下,“复制变量”是什么意思并不清楚。) -
请发布更多代码。
determineClosest可能使用的是原始数组,而不是传入的副本。
标签: java arraylist indexoutofboundsexception