首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程java.lang.IndexOutOfBoundsException异常:索引: 0,大小: 0?

线程java.lang.IndexOutOfBoundsException异常:索引: 0,大小: 0?
EN

Stack Overflow用户
提问于 2015-10-14 13:25:47
回答 2查看 416关注 0票数 1

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

代码语言:javascript
复制
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)肯定不是空的?有什么帮助或想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-10-14 15:28:46

看看JavaDoc for ArrayList constructor吧。据说:

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

现在来看看ArrayList#size()的描述:

返回此列表中的元素数。

你得到的异常是由于对这两种方法行为的误解造成的。甚至在你的第一次迭代中,你用initialCapacity通过构造函数创建了2个ArrayList实例,你假设你的ArrayList是用某个东西初始化的,但是没有。您的列表仍然是空的,即使在第一次迭代中,调用ArrayList#size()也会返回0。

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-10-14 14:38:16

问题是:你正在隐蔽地划分列表,当列表的大小变成1时,就是i.e 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条件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33117208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档