【问题标题】:UnsupportedOperationException on Collection集合上的 UnsupportedOperationException
【发布时间】:2010-05-22 09:38:39
【问题描述】:

在研究 Collection API 时,我们发现如果 Collection 的当前实现不支持这些功能,某些方法(addremove、...)可能会抛出 java.lang.UnsupportedOperationException

实际上,在 JDK 中是否有一个具体的 Collection 不支持这些方法?

非常感谢您的回答。

【问题讨论】:

标签: java exception collections


【解决方案1】:

通常当您创建类似List<String> sample=Collections.emptyList(); 的列表时。列表sample 将创建为Collections.unmodifiableCollection()

  • 所以列表示例不支持动态列表操作。您只能使用赋值运算符将另一个列表分配给该列表。例如>

    List<String> ls=new ArrayList<String>();
    ls.add("one");
    ls.add("Three");
    ls.add("two");
    ls.add("four"); 
    sample = ls;
    
  • 对于动态列表操作,您应该使用如下语法 List&lt;String&gt; sample= new ArrayList&lt;String&gt;();。在此列表中您可以执行sample.add(), sample.addAll() 等...

【讨论】:

  • 被否决为误导,因为sample = ls 毫无意义:变量赋值操作总是成功的,并且无论之前指派给的变量是什么,都一样工作。而且,顺便说一句,他中间的ls 变量是没用的;一开始会产生完全相同的行为sample = new ArrayList&lt;String&gt;(); sample.add("blah");
  • @AlainBECKER 很高兴看到 10 年前写的答案的评论。我同意你的评论,因为我看到 ppl 可能会被误导。但是答案的意图是不同的。
【解决方案2】:

除了Collections.unmodifiable* 方法返回的集合之外,还有一些有趣的情况会实际抛出UnsupportedOperationException

  • 通过entrySet()keySet()values() 访问的Map 的集合视图可以删除但不能添加元素,
  • Arrays.asList 返回的列表视图既不能添加也不能删除,
  • 此外,从 Collections.empty*Collections.singleton* 方法获得的对象也被标记为 "immutable",所以 - 尽管 API 文档中没有明确说明 - 我想这些抛出尝试修改它们的例外情况。

【讨论】:

  • 当我尝试从通过 Arrays.asList(...) 创建的列表中删除元素时出现异常
【解决方案3】:

明显的例子是从Collections.unmodifiableCollection() 和其他类似方法返回的实现。会更改 Collection 的方法会引发此异常。

【讨论】:

  • 好的。这似乎是逻辑。谢谢。 JDK 的当前(可修改)实现又如何呢?我想所有这些类都不会抛出这个异常?
【解决方案4】:

是的。比如调用Collections.unmodifiableList(list),返回的列表不支持add(..)

然而,这些集合大多是私有类,未公开 API,因此您无法实例化它们。

【讨论】:

  • 感谢 Bozho,也提供了这个答案 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2019-12-20
  • 2015-11-06
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多