ArrayList的越界错误

问题描述

Map<Integer, List<ByteBuffer>> readCache = ServiceCache.getReadcache(); Set<Integer> 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); }大致代码如上,从map中取出一个ArrayList,在使用之前我判断buffer.size() >0 了。为什么还会报异常Exception in thread "Thread-13" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0at 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)

解决方案

看错误提示: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<String> list = new ArrayList<String>();//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.javaE:>java TestHello World!helloException 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)
解决方案二:
同意楼的是线程并发问题引起。但是看你个的那部分代应该不会引发这个问题只为你的变量都是局部变量,楼主是不是没有原始的代码上传呢。。。。或者少了关键的部分
解决方案三:
看起来好像没有错的,问题是在这里出来的么?从这里看,问题应该不是在这里出现的因为是线程,这个需要再多的代码,我肯定这里没有错
解决方案四:
如果判断其为null则为list==null如果判断里面有没有元素则为list.size()==0这两个是不同的。就像""与null是不同的。

时间: 2024-08-02 06:55:08

ArrayList的越界错误的相关文章

C#中ArrayList.CopyTo()运行错误的解决方法

在开始讲解C#中ArrayList.CopyTo()运行错误的解决方法之前,先给大家看一段代码: 以下是引用片段: ArrayList list = new ArrayList(); list.Add(1); list.Add(2); byte[] buf = new byte[2]; list.CopyTo(buf); 这段代码看上去,好正常,编译也很顺利通过,不过执行的时候出错了,为什么? 解剖ArrayList,其内部是用一个object 数组实现的,作为一切元素的容器,值类型必须转换成引

脚本-linux AWK报越界错误,但是程序能正常运行,为啥?

问题描述 linux AWK报越界错误,但是程序能正常运行,为啥? 在shell脚本中: arr=(awk 'NR==2{for(i=1;i<=$infoo1;i++)printf $i" "}' $1) // 我用awk读取一个文本的第二行,并将每个域的元素依次赋值给数组arr[],$1是 shell从命令行传入的参数,即我读取的文本的路径,这个文本很简单,第二行内容如下: p.jpg-1 p.jpg-2 p.jpg-3 p.jpg-4 p.jpg-5 p.jpg-6 p.jp

spring4mvc-ajax-requestbody解析不了arraylist报415错误

问题描述 spring4mvc-ajax-requestbody解析不了arraylist报415错误 直接上代码 script代码: function sendMsg3(){ var test=new Array(); test[0]="呵呵1"; test[1]="呵呵2"; test[2]="呵呵3"; test[3]="呵呵4"; test[4]="呵呵5"; var userJsonStr=JSO

VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?

问题描述 VS2010中的WPF程序出现数组越界错误,程序直接终止,但为什么错误列表没有给出相应的提示?每次都需要自己进行调试查问题出现在哪个位置,是我的VS设置有问题吗? 解决方案 解决方案二:你可以调试看看具体问题是在哪里解决方案三:但是我希望能够在错误列表中给出相应的错误提示信息,为什么会没有呢?我记得以前是用,刚开始学习C#,不太熟悉VS2010.引用1楼hefeng_aspnet的回复: 你可以调试看看具体问题是在哪里 解决方案四:运行状态程序crash的时候是直接跳出的,只有调试才给

使用PageHeap.EXE或GFlags.EXE检查内存越界错误

必先利其器之一:使用PageHeap.EXE或GFlags.EXE检查内存越界错误 Article last modified on 2002-6-3 ---------------------------------------------------------------- The information in this article applies to: -        Microsoft Visual C++, 32-bit Editions, version 6.0, SP5

ictclas4j分词工具搭建在hadoop上出现了很多windows底下没有出现过的错误

问题描述 ictclas4j分词工具搭建在hadoop上出现了很多windows底下没有出现过的错误 本人将在windows上调试好的分词工具包移到bantu底下的eclipse上,运行时出现了Exception in thread ""main"" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.ArrayList.elementData(ArrayList.java:418) at java.u

JDK源码分析-ArrayList分析

花了两个晚上的时间研究了一下ArrayList的源码, ArrayList 继承自AbstractList 并且实现了List, RandomAccess, Cloneable, Serializable 通过实现这三个接口 就具备了他们的功能 RandomAccess 用来表明其支持快速(通常是固定时间)随机访问 Cloneable可以克隆对象 Serializable 对象序列化就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便地实现对象的传输和存储,Serializable

关于java越界的问题。。。。请大神解答

问题描述 关于java越界的问题....请大神解答 public class Solution { public String getHint(String secret, String guess) { int bulls=0; int cows=0; char[] sec = secret.toCharArray(); char[] gue = guess.toCharArray(); int[] s=new int[10]; int[] g=new int[10]; for(int i=0

JAVA几个常见错误简析

错误 1,空指针错误 java.lang.NullPointerException 使用基本的JAVA数据类型,变量的值要么已经是默认值,如果没有对其正常赋值,程序便不能通过编译,因此使用基本的JAVA数据类型(double,float,boolean,char,int,long)一般不会引起空指针异常.由此可见,空指针异常主要跟与对象的操作相关. 下面先列出了可能发生空指针异常的几种情况及相应解决方案: 不管对象是否为空就直接开始使用. (JSP)代码段1: out.println(reque