繁体   English   中英

线程“主”中的异常java.lang.IndexOutOfBoundsException:索引:0,大小:0?

[英]Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 0, Size: 0?

因此,我在以下代码中收到上述错误(我的目标是递归地对我的对象进行排序并按区域排列它们)。

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)肯定不是空的? 有什么帮助或想法吗? 谢谢!

看一下JavaDoc的ArrayList构造函数 据说:

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

现在在ArrayList#size()说明中:

返回此列表中的元素数。

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

使用初始容量来定义内部数组的大小,以使ArrayList更有效率,因为在ArrayList增大时,不必重复重新分配内部数组。 它不会使用某些内容初始化列表,并且如果不手动添加元素,则无法对元素进行任何操作。

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

问题是:您将列表分为两半,当列表的大小变为1时, ie data.size() = 1 data.size() / 2值变为

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

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

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

递归始终需要一个退出路径,否则它将无限期地递归。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM