黑马程序员技术交流社区

标题: IndexOutOfBoundsException异常是什么意思? [打印本页]

作者: 何清林    时间: 2014-2-28 14:53
标题: IndexOutOfBoundsException异常是什么意思?
         今天写程序的时候遇到了IndexOutOfBoundsException异常,解决不了,IndexOutOfBoundsException是什么异常?
废话不多说,先贴出代码:
import java.util.ArrayList;
public class Test1
{
public static void main(String[] args)
{
  ArrayList<String> array = new ArrayList<String>();  array.add("hello");
  array.add("itcast");
  array.add("abc");
  array.add("world");  int size = array.size();  for(int x=0; x<size; x++)
  {
   if("abc".equals(array.get(x)))
   {
    array.remove(x);
   
   }
  }
}
}

异常提示:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

作者: kira    时间: 2014-2-28 15:07
数组角标越界 经常见的一个异常
作者: skyname    时间: 2014-2-28 15:22
ArrayList就是传说中的动态数组,它可以动态的增加和减少元素 、实现了ICollection和IList接口 、灵活的设置数组的大小。要注意,ArrayList中remove()方法的使用:public E remove(int index) 移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1),所以,刚开始ArrayList.size()值是4,但当执行了remove之后,ArrayList中元素的个数就已经为3了,而for循环中size的值仍为4,当然会出现索引越界异常了。
import java.util.ArrayList;
import java.util.List;

public class ArrayListTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                List<String> lis=new ArrayList<String>();
                lis.add("hello");
                lis.add("java");
                lis.add("world");
                lis.add("study");
                                    System.out.println(lis.size());
                //int size=lis.size();
                for(int i=0;i<lis.size();i++){
                        if("world".equals(lis.get(i)))
                                lis.remove(i);
                }                       
                System.out.println(lis.size());
                for(String li:lis){
                        System.out.println(li);
                }
        }

}
作者: 平凡成就非凡    时间: 2014-2-28 15:25
你把 int size=array.size( )定义在啦循环体外, size的值在这里是固定啦是4.当你在循环体中删除元素。ArratList的大小就变成啦3.所以你的角标就越界啦。
作者: 曾经的迷失    时间: 2014-2-28 16:07
本帖最后由 曾经的迷失 于 2014-2-28 16:14 编辑

因为你size不在for循环内,删除了一个元素后,元素变成了三个元素。而size还是指向原来的array.size(),也就是四个元素。所以最后报错,角标越界。把int size =array.size()定义在for循环内就ok了,以下代码共参考,可以明显看出元素的变化:
  1. import java.util.*;
  2. public class Test
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList<String> array = new ArrayList<String>();
  7.                 array.add("hello");
  8.                 array.add("itcast");
  9.                 array.add("abc");
  10.                 array.add("world");
  11.                 //删除前。
  12.                 print(array);

  13.                 /**
  14.                 通过for循环查找指定的元素,并删除
  15.                 */
  16.                 for(int x=0; x<array.size(); x++)
  17.                 {
  18.                    if("abc".equals(array.get(x)))
  19.                    {
  20.                                 array.remove(x);
  21.                    }
  22.                 }
  23.                 //删除后
  24.                 print(array);
  25.         }
  26.         /**
  27.         定义一个打印功能,把打印数组列表的功能封转起来。
  28.         */
  29.         public static void print(ArrayList<String> array)
  30.         {
  31.                 Iterator<String> it = array.iterator();
  32.                 while(it.hasNext())
  33.                 {       
  34.                         System.out.print(it.next()+"\t");
  35.                 }
  36.                 System.out.println();
  37.         }
  38. }
复制代码











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2