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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘源 中级黑马   /  2012-7-12 16:35  /  1579 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘源 于 2012-7-15 00:31 编辑

import java.util.*;
class ListDemo1
{
        public static void main(String[] args)
        {
                ArrayList a1= new ArrayList();
                a1.add("java01");
                a1.add("java02");
                a1.add("java03");
                a1.add("java04");
               
                for(ListIterator li = a1.listIterator();li.hasNext();)
                {
                        Object obj= li.next();
                        if(obj.equals("java02"))
                        {
                                li.add("java04");//单独打印结果[java01, java02, java04, java03, java04]
                                li.set("java100");//单独打印结果[java01, java100, java03, java04]
                              2个同时存在系统就报IllegalStateException
                        }
                        
                }
               
                sop(a1);
        }
        public static void sop(Object args)
        {
                System.out.println(args);
        }
}
为什么红色2个语句单独存在都可以啊,但是放到一起就会IllegalStateException。这个错误啊,ListIterator这个接口的方法不是可以进行CURD吗?难度一次就只能改 一次吗。那也太不方便了啊,还是我的代码有问题吗。希望知道的人解答下。






1 个回复

倒序浏览
这个类还真是没用过啊

不过我查了查文档上面是这么写的:
在这个接口中Interface ListIterator<E>
set
void set(E e)
        Replaces the last element returned by next or previous with the specified element (optional operation). This call can be made only if neither ListIterator.remove nor ListIterator.add have been called after the last call to next or previous.

IllegalStateException - if neither next nor previous have been called, or remove or add have been called after the last call to next or previous.
就是说当你调用了add或者remove方法后就不要再调用set方法了,或者在调用set方法之前调用next方法或者previous方法,将指针移动到相应的位置

原因我看了一下源代码,
这是add方法·:
  1. public void add(E e) {
  2.             checkForComodification();

  3.             try {
  4.                 AbstractList.this.add(cursor++, e);
  5.                 lastRet = -1;
  6.                 expectedModCount = modCount;
  7.             } catch (IndexOutOfBoundsException ex) {
  8.                 throw new ConcurrentModificationException();
  9.             }
  10.         }
  11.     }
复制代码
注意到里面有这样一个变量:lastRet = -1;
当我们调用完add方法,再紧接着调用set方法时:
  1. public void set(E e) {
  2.             if (lastRet == -1)
  3.                 throw new IllegalStateException();
  4.             checkForComodification();

  5.             try {
  6.                 AbstractList.this.set(lastRet, e);
  7.                 expectedModCount = modCount;
  8.             } catch (IndexOutOfBoundsException ex) {
  9.                 throw new ConcurrentModificationException();
  10.             }
  11.         }
复制代码
看到第一个if语句了么?抛异常了
但是当调用next或previous方法时:
  1. public E next() {
  2.             checkForComodification();
  3.             try {
  4.                 E next = get(cursor);
  5.                 lastRet = cursor++;
  6.                 return next;
  7.             } catch (IndexOutOfBoundsException e) {
  8.                 checkForComodification();
  9.                 throw new NoSuchElementException();
  10.             }
  11.         }
复制代码
可以看到lastRet = cursor++;上次操作的指针又移回来了
但是有谁可以帮我解释下,为什么要这样实现呢。。?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马