You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Vector的Vector中添加元素时触发ArrayIndexOutOfBoundsException

问题分析与解决方案

嘿,我来帮你捋清楚这个问题的根源~

你遇到的ArrayIndexOutOfBoundsException,核心原因是混淆了Vector的「初始容量」和「实际元素数量(size)」。

问题出在哪?

你初始化内层Vector的代码是:

matrix.add(i,new Vector<Edge>(9));

这里的9是Vector的初始容量——意思是这个Vector一开始可以容纳9个元素,不用马上扩容,但它里面实际没有任何元素,所以row.size()返回的是0,而不是9。

而Vector.add(int index, E element)方法有个严格要求:传入的index必须小于等于当前的size()。如果你的d(列索引)大于0,比如是1,那此时row.size()是0,index=1 > 0,自然就触发数组越界异常了。

怎么解决?

你需要让内层Vector的实际元素数量(size)至少等于你的最大列索引+1,这样才能安全地在指定位置设置元素。这里有两种常用方案:

方案1:初始化时预先填充null元素

在创建内层Vector后,先添加9个null元素,让它的size变成9,之后就可以直接用set()方法设置指定位置的元素(比add()更适合这种场景):

Iterator<Edge> iter = array.iterator();
private Vector<Vector<Edge>> matrix = new Vector<Vector<Edge>>(9);
for (int i=0;i<9;i++){
    Vector<Edge> row = new Vector<>(9);
    // 填充9个null,让row的size变为9
    for (int j = 0; j < 9; j++) {
        row.add(null);
    }
    matrix.add(i, row);
}
while (iter.hasNext()) {
    Edge e = iter.next();
    int s = e.source; //row
    int d = e.destination; //col
    Vector<Edge> row = matrix.get(s);
    // 用set替换指定位置的null
    row.set(d, e);
}

方案2:添加元素时动态填充null

如果不想一开始就填充所有null,可以在设置元素前检查内层Vector的size,不足的话先补null到目标索引位置:

while (iter.hasNext()) {
    Edge e = iter.next();
    int s = e.source; //row
    int d = e.destination; //col
    Vector<Edge> row = matrix.get(s);
    // 确保row的size至少是d+1,不足就补null
    while (row.size() <= d) {
        row.add(null);
    }
    row.set(d, e);
}

补充说明

你问到“是否需要先将所有元素初始化为null”——其实本质是需要让Vector的size足够覆盖你的索引范围,初始化null是最直接的方式。如果不预先填充,直接用add()的话,只能往现有元素的末尾追加,没法直接指定大于当前size的索引位置。

内容的提问来源于stack exchange,提问作者I Like

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:55