经过我的测试,这里有两方面的问题:
1、在iterator.remove()方法前需要有iterator.next()操作的出现。原因如API所说:“IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。”代码应改为类似这样的:- while (it.hasNext()) {
- System.out.println(it.next());//此处可以加个判断或者输出,总之有next()就行
- it.remove();
- }
复制代码 2、当上面的内容改完之后还会出现一个问题,也是remove的错,不过这时的原因可以往上看(因为用 了Arrays.asList(str)),报告的是UnsupportedOperationException异常,这里错误的根本性原因就是java语义的问题. 对于String[]类型来说, 你不可以删除里面的元素, 而导致后续的元素移动.所以应该抛出这个异常,为什么说是操作String[]类型呢?查看api:(asList)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直写”到数组。)问题就在这里,asList返回的不是“传统”意义上的List,而是对数组包装了一下,本质还是数组,所以不能够remove。注意上面那句帮助原文:对返回列表的更改会“直写”到数组。所以我们要用remove还是先用add方法老实来吧,写一个循环填加元素:- public static void main(String[] args) {
- String[] str = { "hi", "hell", "world" };
- //List<String> li = Arrays.asList(str);
- List<String> li = new ArrayList<String>();
- for (int i = 0; i < str.length; i++) {//循环填加元素
- li.add(str[i]);
- }
- Iterator<String> it = li.iterator();
- while (it.hasNext()) {
- System.out.println(it.next());//调用remove之前先调用next方法
- it.remove();
- }
- System.out.println(li);
- }
复制代码 |