iteye_12159 2012-09-04 19:22
浏览 771
已采纳

ArrayList.add()时报越界异常

今天遇到几个很诧异的越界异常:
List cmds = TerminalMaps.terminal_commands.get(mac);
if (cmds == null){
cmds = new ArrayList();

}

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); //这儿也报越界异常
}

这两个越界异常的诡异极了, 而且很难重现.当我以为只是幻觉的时候, 他又时不时蹦出来恶心我一把.

请大家指教.

  • 写回答

4条回答 默认 最新

  • jinnianshilongnian 2012-09-04 19:54
    关注

    怀疑你是不是并发访问cmds 和 cmdList

    如果单线程应该是不会有这种问题的:

    cmds.add(command.toString()); //在这一行报了个java.lang.ArrayIndexOutOfBoundsException: -1

    还有一个remove时越界异常:
    while (cmdList.size() > 0){
    String cmd = cmdList.remove(0); //这儿也报越界异常
    }

    ArrayList add实现
    [code="java"] public boolean add(E e) {
    ensureCapacity(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
    }[/code]
    可能 size 超过int大小 造成负数引起 你看看 异常 索引多大

    ArrayList的size 和 remove实现
    [code="java"]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);
    }
    

    [/code]

    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 cmds = new ArrayList(TerminalMaps.terminal_commands.get(mac)); ---做个副本

    2、cmdList也一样做个本地副本

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题