【问题标题】:Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest线程“主”java.lang.IndexOutOfBoundsException 中的异常:源不适合目标
【发布时间】:2022-01-30 14:42:27
【问题描述】:

我有对象:

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 返回:

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

【问题讨论】:

    标签: java list eclipse arraylist copy


    【解决方案1】:

    除了 greg-449 的回答,我想指出的是,与其在声明 ArrayList 时直接创建它,不如在构造函数中创建它,使用 ArrayList 构造函数另一个列表作为它的参数。

    这会将您的代码更改为:

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

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

    【讨论】:

    • 这可能有效 :) 谢谢!
    【解决方案2】:

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

    改为使用addAll:

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

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 2011-07-05
      • 2012-10-23
      • 2018-10-29
      • 2017-01-02
      • 2016-01-12
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多