![](/img/trans.png)
[英]hibernate - Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 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.