gpt4 book ai didi

java - 什么可能导致此异常?

转载 作者:行者123 更新时间:2023-11-30 11:45:44 25 4
gpt4 key购买 nike

我偶尔会遇到一个非常奇怪的异常:

04-18 18:08:08.121: E/AndroidRuntime(3031): Uncaught handler: thread main exiting due to uncaught exception
04-18 18:08:08.141: E/AndroidRuntime(3031): java.lang.ArrayIndexOutOfBoundsException
04-18 18:08:08.141: E/AndroidRuntime(3031): at java.util.ArrayList.addAll(ArrayList.java:257)
04-18 18:08:08.141: E/AndroidRuntime(3031): at com.zigzagworld.text.formatter.FormatManager.formatIfNeeded(FormatManager.java:185)
etc.

这是在 1.6 模拟器上发生的。我的代码中调用 addAll 的行是:

mTasksAbove.addAll(schedule.above);

我唯一能想到的是对 mTasksAbove 的某种并发访问。但是,我一直非常小心地确保对同一对象的所有访问都是同步的。我唯一想到的另一件事是,如果 schedule.above 在执行 addAll 期间被修改,但我相信这会产生一个 ConcurrentModificationException(加上,我不认为我的代码会那样做)。有谁知道我应该寻找的其他东西吗?

编辑

根据 Raykud 的回答,我做了一些挖掘并找到了确切的错误。在 Android 1.6 源代码中,addAll 方法调用了一个内部方法,growAtEnd 是有问题的。这是来源本身:

private void growAtEnd(int required) {
int size = size();
if (firstIndex >= required - (array.length - lastIndex)) {
int newLast = lastIndex - firstIndex;
if (size > 0) {
System.arraycopy(array, firstIndex, array, 0, size);
int start = newLast < firstIndex ? firstIndex : newLast;
Arrays.fill(array, start, array.length, null);
}
firstIndex = 0;
lastIndex = newLast;
} else {
int increment = size / 2;
if (required > increment) {
increment = required;
}
if (increment < 12) {
increment = 12;
}
E[] newArray = newElementArray(size + increment);
if (size > 0) {
System.arraycopy(array, firstIndex, newArray, 0, size);
/********************************************************\
* BUG! The next 2 lines of code should be outside the if *
\********************************************************/
firstIndex = 0;
lastIndex = size;
}
array = newArray;
}
}

当列表先前已填充然后清空时,该错误会抬起头来,留下 size == 0firstIndex == lastIndex > 0 并且您尝试添加一个足够大的集合,使其不适合 lastIndex 和当前数组大小。

从 2.2 开始,当 addAll 方法被重写并且 growAtEnd 从类中消失时,这个错误就消失了。

谢谢 Raykud 的指点!

最佳答案

从 1.5 开始,arraylist 中的 addAll 方法有问题,它应该在未来的发布中得到修复,但我不确定是哪一个。要解决此问题,您可以创建一个 Iterator为您的 Collection 并一一添加元素。这里有一些代码可以提供帮助:

Iterator<MyTypeofObjectToAdd> e = myArrayListToCopyFrom.iterator();
while (e.hasNext()) {
arrayListToAdd(e.next());
}

IndexOutOfBounds异常是因为你试图从一个什么都没有的位置取回一个项目。

关于java - 什么可能导致此异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10219249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com