线程 "main" java.lang.IndexOutOfBoundsException 中的异常:源不适合目标

Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest

我有对象:

static class Truck {
    
    ArrayList<Integer> route = new ArrayList<Integer>();
    double weight = 0;
    int route_weight = 0;

    Truck() {
    }

    Truck(ArrayList<Integer> route) {
        Collections.copy(this.route, route);
    }
    
    //getters and setters
}

进入此列表的对象:

static ArrayList<Truck> trucks=new ArrayList<Trucks>();

我正在尝试制作列表的完整副本:

        ArrayList<Truck> copy=new ArrayList<>();
        copy=cloneList(trucks);
    public static ArrayList<Truck> cloneList(ArrayList<Truck> trucksList) {
        ArrayList<Truck> clonedList = new ArrayList<Truck>();
        for (Truck truck : trucks) {
            Truck w=new Truck(truck.getroute());
            clonedList.add(w);
        }
        return clonedList;
    }

但是我收到一个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest

getroute returns:

[0, 9, 11, 1, 15, 3, 0]

Collections.copy 要求目标列表的大小至少是源列表的大小。当您尝试进行复制时,您的 this.route 大小为 0,因此会出现异常。

改为使用addAll:

Truck(ArrayList<Integer> route) {
   this.route.addAll(route);
}

除了 greg-449 的回答之外,我想指出的是,不是在声明时直接创建 ArrayList,您也可以在构造函数中创建它,利用 ArrayList 以另一个列表作为参数的构造函数。

这会将您的代码更改为:

Truck() {
    this.route = new ArrayList<>();
}

Truck(ArrayList<Integer> route) {
    this.route = new ArrayList<>(route);
}

新创建的列表将包含 route 列表中的所有元素,顺序相同。