A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不愿一人 中级黑马   /  2013-12-23 12:37  /  992 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

几天看了一些java测试题,有这样一个问题:
一个ArrayList对象alist中存有若干个字符串元素,请遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素.
下面是我写的代码:
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
请大神帮忙看看

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
楼主,出现角标越界异常主要是因为:     在  for(int x=0; x<size; x++)          {
                   if("abc".equals(array.get(x)))
                   {
                      array.remove(x);
                    
                   }
          }中 size是4,所以可以取到x=3这个角标的元素,但是

     array.remove(x)后实际上集合中还有三个元素,也就是说x这个角标此时
只能取到2,于是乎发生 IndexOutOfBoundsException异常
     为什么楼主不使用  ListIterator呢?,这样就不会发生上边的问题了,
可以用以下代码替换掉for循环:
  ListIterator  li = array.listIterator();
          while(li.hasNext()){
                 String str = (String) li.next();
                  if("abc".equals(str))
                   {
                      li.remove();
                   }
          }

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
array.add("world");  int size = array.size();  for(int x=0; x<size-1; x++),角标越界。应判断x<size-1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马