【问题标题】:Strange UnsupportedOperationException when calling list.remove(0)调用 list.remove(0) 时出现奇怪的 UnsupportedOperationException
【发布时间】:2011-10-31 10:31:32
【问题描述】:

我有这个方法,它接受一个可变参数的字符串,从中创建一个列表,然后尝试删除列表的第一个元素。

public void importFrom(String... files) {
    List<String> fileList = Arrays.asList(files);

    String first = fileList.remove(0);
    // other stuff
}

但只要调用remove,就会抛出UnsupportedOperationException。我的猜测是返回 List-Type 不支持 remove 方法。我对么?我有什么选择?

【问题讨论】:

  • 看起来像一个编译错误。您有 2 个变量称为文件,一个是列表,另一个是数组。您能否提供可编译的代码,然后我们可以看看您为什么会收到该错误。
  • 返回的列表充当支持数组的view。您不能修改列表。
  • @sethu 只是一个错字,已修复。

标签: java list collections


【解决方案1】:

Arrays.asList 仅在数组周围提供一个瘦包装器。这个包装器允许您使用List API 对数组执行大多数 操作。来自 JavaDoc 的引用:

返回一个由指定数组支持的固定大小列表。 [...] 此方法充当基于数组和基于集合的 API [...]

之间的桥梁

如果你真的想删除一些东西,那么这可能会起作用:

List<String> realList = new ArrayList<String>(Arrays.asList(stringArray));

这个创建了一个真正的ArrayList(支持remove)并用另一个列表的内容填充它,这个列表恰好是你的String[]的包装器。

【讨论】:

    【解决方案2】:

    Arrays.asList 提供数组的列表视图,由数组支持。并且数组不可调整大小。任何更改其大小的尝试都会引发异常。

    【讨论】:

      【解决方案3】:

      您可以只创建一个new ArrayList&lt;String&gt;(),然后遍历所有文件for (String file : files) fileList.add(file);。或者你可以使用你已经创建的 List 并使用 fileList.addAll(files); 将它添加到新的 ArrayList 中

      【讨论】:

        【解决方案4】:

        Arrays.asList() 返回 Arrays.ArrayList 的实例,这是不可修改的列表,因为它是数组的简单包装器。您不能从数组中删除元素。

        这是用asList()的javadoc写的:

        返回一个由指定数组支持的固定大小的列表。

        【讨论】:

        • 它不是不可修改的。 javadoc 说“(将返回列表的更改“写入”到数组。)”。
        【解决方案5】:

        返回的 list 充当 支持的数组view。您不能直接修改列表,只能通过支持的数组。但是,您不能调整数组的大小。

        【讨论】:

          猜你喜欢
          • 2018-06-27
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多