线程" main"中的例外情况java.lang.IndexOutOfBoundsException:索引:0,大小:0?

时间:2015-10-14 05:25:47

标签: java recursion indexing indexoutofboundsexception

所以我在下面的代码中收到了上面的错误(我的目标是递归地对我的对象进行排序并按区域排列)。

private static void recursionSort(ArrayList<GeometricObject> data)
        {


            ArrayList<GeometricObject> a = new ArrayList<GeometricObject>(data.size() / 2);
            ArrayList<GeometricObject> b = new ArrayList<GeometricObject>(data.size() - a.size());     // Split array into two
            //   halves, a and b
            for(int i = 0; i < data.size(); i++) 
            {
                if(i < a.size())
                    a.set(i,data.get(i));
                else             
                    b.set(i - a.size(),data.get(i));
            }

            recursionSort(a);                              // Recursively sort first
            recursionSort(b);                              //   and second half.

            int ai = 0;                                // Merge halves: ai, bi
            int bi = 0;                                //   track position in
            while(ai + bi < data.size()) {             //   in each half.
                if(bi >= b.size() || (ai < a.size() && a.get(ai).getArea() < b.get(bi).getArea())) {
                    data.set(ai + bi,a.get(ai)); // (copy element of first array over)
                    ai++;
                } else {
                    data.set(ai + bi,b.get(bi)); // (copy element of second array over)
                    bi++;
                }
            }
            System.out.println(data);
        }

现在令我困惑的是我的索引从0开始(正确吗?)那么为什么我的索引在0大小为0,我列表中的第一个对象(索引0)肯定不是空的?任何帮助或想法?谢谢!

2 个答案:

答案 0 :(得分:1)

看看JavaDoc for ArrayList constructor。据说:

  

构造一个具有指定初始容量的空列表。

现在在ArrayList#size() desctiption:

  

返回此列表中的元素数。

您获得的异常是由于对这两种方法行为的误解造成的。即使在第一次迭代中,您也可以通过带有initialCapacity的构造函数创建2个ArrayList实例,并且您认为您的ArrayList是使用somethig初始化的,不是。您的列表仍然为空,即使在第一次迭代中,对ArrayList#size()的调用也会返回0。

使用初始容量来定义内部数组大小,以使您的ArrayList更高效,因为在您的ArrayList增长时,它不必重复重新分配内部数组。它没有用某些东西初始化你的列表,如果你不手动添加它们就不能对元素进行任何操作。

你得到java.lang.IndexOutOfBoundsException,因为你试图为某个元素调用ArrayList#set(int index, E element)方法,这个元素不存在(你的列表是空的并且尚未初始化)。

答案 1 :(得分:0)

问题是:您正在重新划分列表,当列表大小变为1时,i.e data.size() = 1data.size() / 2值变为

现在你的ArrayList<GeometricObject> a = new ArrayList<GeometricObject>(data.size() / 2); 大小

因此,在Arraylist a中设置值时,它正在给出

  

线程“main”中的异常java.lang.IndexOutOfBoundsException:Index:   0,大小:0

递归始终需要一个退出路径,否则会无限期地重复出现。

我想你需要一个基础和终止案例来解决你的问题。 提示:尝试使用某些if else条件。