-
ArrayList.add()时报越界异常5
今天遇到几个很诧异的越界异常:
List<String> cmds = TerminalMaps.terminal_commands.get(mac);
if (cmds == null){
cmds = new ArrayList<String>();
}
StringBuffer command = new StringBuffer();
command.append(Constant.CMD_START).append("register_response").append(Constant.CMD_ITEM_TOKENIAER).append("ok");
cmds.add(command.toString()); //在这一行报了个java.lang.ArrayIndexOutOfBoundsException: -1
还有一个remove时越界异常:
while (cmdList.size() > 0){
String cmd = cmdList.remove(0); //这儿也报越界异常
}
这两个越界异常的诡异极了, 而且很难重现.当我以为只是幻觉的时候, 他又时不时蹦出来恶心我一把.
请大家指教.2012年9月04日 19:22
4个答案 按时间排序 按投票排序
-
采纳的答案
怀疑你是不是并发访问cmds 和 cmdList
如果单线程应该是不会有这种问题的:
cmds.add(command.toString()); //在这一行报了个java.lang.ArrayIndexOutOfBoundsException: -1
还有一个remove时越界异常:
while (cmdList.size() > 0){
String cmd = cmdList.remove(0); //这儿也报越界异常
}
ArrayList add实现public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
可能 size 超过int大小 造成负数引起 你看看 异常 索引多大
ArrayList的size 和 remove实现public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; } private void RangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException( "Index: "+index+", Size: "+size); }
1、RangeCheck 如果index >=size 抛出越界;
2、elementData[--size] 如果size=0 抛出
3、如果index<0抛出
你的代码
while (cmdList.size() > 0){ //当size() > 0 在该点单线程的话绝对不会出现size=0 而且index >=0 没有问题的
String cmd = cmdList.remove(0); //移除第0个
}
可能是多线程并发访问造成的,建议
1、List<String> cmds = new ArrayList(TerminalMaps.terminal_commands.get(mac)); ---做个副本
2、cmdList也一样做个本地副本
2012年9月04日 19:54
-
第一个问题:
ArrayList.add不会报越界异常, 最多堆OutOfMemory,你这里List<String> cmds = TerminalMaps.terminal_commands.get(mac);
,起作用的应该是这句吧,看看这个怎么实现的。
第二个问题:
并发情况下,有可能发生这个问题,2个线程都进入了while循环,结果第2个remove(0)的就会报越界异常。2012年9月05日 09:40
-
只有两种可能会引起这种情况:
1。多线程的并发访问导致的,需要有外部同步机制。
2。List<String> cmds可能是List的特殊实现,检查它的类型。2012年9月04日 22:06
-
还有一个remove时越界异常:
while (cmdList.size() > 0){
String cmd = cmdList.remove(0); //这儿也报越界异常
}
第一次进入while存在0的元素是没问题的,当第二次进入0的元素已经被移除。所以会有
越界异常2012年9月04日 19:31
相关推荐
模仿sun公司的ArrayList自己封装了一个容器类,能基本实现全部功能,在数组的一些方法上进行了修改优化
老猿说说-ArrayList MD文件 1. 所有的操作都是线程安全的,我们在使用时,无需再加锁; 2. 多个线程同时进行put、remove等操作时并不会阻塞,可以同时进行,和HashTable不同,HashTable在操作时,会锁住整个Map; 3. ...
"Java ArrayList.add 的实现方法详解" Java ArrayList 是一种常用的 List 实现, 其中 boolean add(E e) 方法和 void add(int index, E element) 方法是两个重要的实现方法。下面我们将详细介绍这两个方法的实现...
names.add(0, "Amy"); System.out.println(names); // [Amy, Ben, Cat] ``` 六、ArrayList 类的泛型 从 Java 5 开始,ArrayList 和其他集合类可以指定元素的类型,例如: ```java ArrayList<String> words = new ...
arraylist .
"Arabic2ArrayList.rar"这个压缩包文件显然与阿拉伯语的显示和处理有关,尤其是针对单片机系统。让我们深入探讨一下其中涉及的关键知识点。 1. **字符编码**:阿拉伯语属于右向左(RTL)语言,其字符编码通常遵循...
"java提高篇(二一)-----ArrayList.pdf" ArrayList 是一个实现了 List 接口的动态数组,具有以下特点: 1. 动态数组:ArrayList 的大小是可变的,可以根据需要自动增长。 2. 实现了所有可选列表操作:ArrayList ...
ArrayList.prototype.add = function(element) { this.array.push(element); } ``` **删除元素**: 删除元素通常有两种方式:按索引删除和按值删除。在JavaScript中,按索引删除使用`splice`方法,按值删除则需要...
ArrayList.cpp
ArrayList.java
arraylist.java
Arraylist
博客链接中的文章可能详细解释了这些方法的实现原理,包括扩容策略、效率分析以及如何避免或处理潜在的异常情况,如空指针异常、索引越界等。 在实际开发中,ArrayList常用于需要频繁进行元素添加和查找但较少进行...
ArrayList的Java源代码,可供开发者查看阅读,希望对大家有用,同时可以参看个人博文,便于理解。https://blog.csdn.net/la859962513/article/details/82752510
day14-ArrayList集合 1.ArrayList 1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ...array.add("hello"); array.add("world"); array.add("java");