Java ArrayIndexOutOfBounds 数组映射异常
Java ArrayIndexOutOfBounds Exception on array map
我有一个迭代 ArrayMap 键的代码,但由于未知原因我得到了一个数组索引越界异常
来自 Crashalytics:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=56; index=56
android.util.ArrayMap.colGetEntry (ArrayMap.java:763)
android.util.MapCollections$ArrayIterator.next (MapCollections.java:55)
代码如下所示:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
for (String s : handlers.keySet()) {
handlers.remove(s);
}
}
}
异常发生在这一行:for (String s : handlers.keySet())
知道我做错了什么吗?
试试这个
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
ArrayMap<String,RequestData> tempHandlers = handlers;
for (String s : tempHandlers.keySet()) {
handlers.remove(s);
}
}
}
您正在修改正在迭代的 ArrayMap。这是 Java 中的反模式,会导致错误。我建议您使用另一个 ArrayMap 进行修改。
您不能在迭代时从 Map
或 List
中删除。
使用Map
/List
的内部清除方法。
例如,handlers.clear();
代码:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
handlers.clear();
}
}
正如其他人提到的,您不能在 for loop
中 remove(Object o)
,您必须使用 Iterator
作为
进行删除
public void removeAllHandlers() {
synchronized (handlers) {
Iterator<String> keyIterator = handlers.keySet().iterator();
while (keyIterator.hasNext()) {
RequestData requestData = handlers.get(keyIterator.next());
if(iDontWant(requestData)) {
keyIterator.remove();
}
}
}
}
我有一个迭代 ArrayMap 键的代码,但由于未知原因我得到了一个数组索引越界异常
来自 Crashalytics:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=56; index=56
android.util.ArrayMap.colGetEntry (ArrayMap.java:763)
android.util.MapCollections$ArrayIterator.next (MapCollections.java:55)
代码如下所示:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
for (String s : handlers.keySet()) {
handlers.remove(s);
}
}
}
异常发生在这一行:for (String s : handlers.keySet())
知道我做错了什么吗?
试试这个
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
ArrayMap<String,RequestData> tempHandlers = handlers;
for (String s : tempHandlers.keySet()) {
handlers.remove(s);
}
}
}
您正在修改正在迭代的 ArrayMap。这是 Java 中的反模式,会导致错误。我建议您使用另一个 ArrayMap 进行修改。
您不能在迭代时从 Map
或 List
中删除。
使用Map
/List
的内部清除方法。
例如,handlers.clear();
代码:
private ArrayMap<String,RequestData> handlers = new ArrayMap<>();
public void removeAllHandlers() {
synchronized (handlers) {
handlers.clear();
}
}
正如其他人提到的,您不能在 for loop
中 remove(Object o)
,您必须使用 Iterator
作为
public void removeAllHandlers() {
synchronized (handlers) {
Iterator<String> keyIterator = handlers.keySet().iterator();
while (keyIterator.hasNext()) {
RequestData requestData = handlers.get(keyIterator.next());
if(iDontWant(requestData)) {
keyIterator.remove();
}
}
}
}