weixin_42470148 2011-08-17 19:39
浏览 401
已采纳

ArrayList的越界错误

[code="java"]
Map> readCache = ServiceCache.getReadcache();
Set sets = readCache.keySet();

        for (Integer siteNum : sets) {
            List<ByteBuffer> buffers = readCache.get(siteNum);                                                  
            if (buffers.size() > 0) {

                ByteBuffer buffer = buffers.get(0);
                HeartBeatPackage hb = ServerDataParser.getHreatBeat(buffer);
                buffers.remove(0);

             }

[/code]

大致代码如上,从map中取出一个ArrayList,在使用之前我判断buffer.size() >0 了。为什么还会报异常
Exception in thread "Thread-13" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.remove(ArrayList.java:387)
at com.hongdian.rtu.process.DisData.run(DisData.java:38)
at java.lang.Thread.run(Thread.java:662)

  • 写回答

4条回答 默认 最新

  • 关注
    看错误提示:Exception in thread "Thread-13"....可能程序在多线程运行中,有多个线程都通过了 if (buffers.size() > 0) 这行代码,此时有一个线程由于阻塞没有继续运行,而其他线程轮询执行buffers.remove(0);  当这个List被remove完了后,那个被阻塞的线程获得了执行权,此时再执行get(0)或remove()时,出现了数组越界.
    你的线程只是并发了但没有同步,所以容易出这样的错误.
    

    相当于ArrayList只是被new了,但是没有add(Object)任何元素.所以你在取第一个值时会报数组越界的错误.
    下面是个简单的例子,可以帮助理解

    import java.util.List;
    import java.util.ArrayList;

    class Test
    {
    public static void main(String[] args)
    {
    System.out.println("Hello World!");
    List list = new ArrayList();
    //if(list.size()>0)
    list.add("hello");
    System.out.println(list.get(0));
    list.remove(0);
    System.out.println(list.get(0));
    }
    }
    后台错误:

    E:>javac Test.java

    E:>java Test
    Hello World!
    hello
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size:
    0
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Test.main(Test.java:15)

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

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器