【问题标题】:Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0?线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0?
【发布时间】:2016-01-12 01:29:29
【问题描述】:

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

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

【问题讨论】:

  • 在你的递归代码中,你有没有考虑过什么是基本情况,什么是终止条件?

标签: java recursion indexing indexoutofboundsexception


【解决方案1】:

看看JavaDoc for ArrayList constructor。据说:

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

现在在ArrayList#size() 说明:

返回此列表中的元素数。

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

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

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

【讨论】:

    【解决方案2】:

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

    现在你的ArrayList&lt;GeometricObject&gt; a = new ArrayList&lt;GeometricObject&gt;(data.size() / 2); 大小为

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

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

    递归总是需要一个退出路径,否则它会无限期地递归。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多