【问题标题】:Index out of bounds when using an copy of the variable [closed]使用变量副本时索引超出范围[关闭]
【发布时间】:2015-05-02 13:34:31
【问题描述】:

我无法理解这一点,所以我希望你们能很好地解释为什么这段代码不起作用。

我的Warehouse 类中有一个ArrayListPoint

这段代码可以正常工作(它在另一个类中,而不是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


【解决方案1】:

determineClosest 可能使用的是原始数组,而不是传入的副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多