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条)

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样