为什么这个嵌套的ArrayList代码抛出异常?

时间:2009-06-22 20:05:58

标签: java arraylist

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(5);
for (int i = 0 ; i < a.size() ; i++){
    a.set(i, new ArrayList<Integer>(10));
}
System.out.println(a.get(a.size()-1).get(9)); //exception thrown

以上代码段在打印部分引发异常。为什么呢?

6 个答案:

答案 0 :(得分:19)

您只设置外部/内部ArrayLists的容量。它们仍然是空的。
而且你的循环甚至都没有执行,因为a.size()是0 您需要第二个内部循环来向它们添加元素。

ArrayList<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>(5);
for (int i = 0; i < 5 ; i++) {
    List<Integer> lst = new ArrayList<Integer>(10);
    for (int j = 0; j < 10; j++) {
        lst.add(j);
    }   
    a.add(lst);
}
System.out.println(a.get(a.size()-1).get(9));

修改并提防a.set(i, ...)。如果i&gt; = a.size()。

,则抛出异常

答案 1 :(得分:2)

我相信如果你把

System.out.println(a.size());

在第一行之后,您将看到外部数组的大小为零。因此循环执行零次,因此在循环之后,您正在请求a的第-1个元素 - 这是一个错误。

答案 2 :(得分:1)

创建new ArrayList<Integer>(10)时,“10”只表示初始容量。它仍然是一个空列表,您无法在其上调用get(9)

答案 3 :(得分:1)

a是一个空列表,所以a.size()= 0所以在a.get(a.size() - 1)中表达式(a.size() - 1)是-1所以a.get( - 1)抛出ArrayIndexOutOfBoundsException

答案 4 :(得分:0)

您已在for循环中创建了空数组列表,因此尝试访问其中的任何元素都会返回null到System.out.println()

修改的 抱歉,不会返回null,而是抛出ArrayIndexOutOfBoundsException。

答案 5 :(得分:0)

请注意new ArrayList(10)创建一个 ArrayList,其内部支持数组最初设置为10。在您向其添加元素之前,ArrayList为空。构造函数允许您将初始内部大小指定为优化度量。