向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
相关产品推荐
相关产品推荐

