【问题标题】:java 8 UnsupportedOperationException on subList.clear()java 8 UnsupportedOperationException on subList.clear()
【发布时间】:2015-12-31 23:26:39
【问题描述】:

这是在 strList5 的 subList.clear() 调用中引发异常的代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public static List<String> removeRange(List<String> strList, int         maxElementsToBeAllowedInList) {
    if (strList.size() > maxElementsToBeAllowedInList) {
        System.out.println("Clearing out sublist: ["
                + strList.subList(maxElementsToBeAllowedInList, strList.size()) + "]");
        strList.subList(maxElementsToBeAllowedInList, strList.size()).clear();
    }
    return strList;
}

public static void main(String[] args) {
    List<String> strList1 = new ArrayList<>();
    List<String> strList2 = Arrays.asList("one", "two", "three");
    List<String> strList3 = Arrays.asList("one", "two", "three", "four", "five");
    List<String> strList4 = Arrays.asList("one", "two", "three", "four", "five", "six");
    List<String> strList5 = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight");

    try {
        System.out.println("Before modification strList1: [" + strList1 + "]");
        ListTruncateEndTest.removeRange(strList1, 5);
        System.out.println("After modification strList1: [" + strList1 + "]");

        System.out.println("Before modification strList2: [" + strList2 + "]");
        ListTruncateEndTest.removeRange(strList2, 5);
        System.out.println("After modification strList1: [" + strList2 + "]");

        System.out.println("Before modification strList3: [" + strList3 + "]");
        ListTruncateEndTest.removeRange(strList3, 5);
        System.out.println("After modification strList1: [" + strList3 + "]");

        System.out.println("Before modification strList4: [" + strList4 + "]");
        ListTruncateEndTest.removeRange(strList4, 5);
        System.out.println("After modification strList4: [" + strList4 + "]");

        System.out.println("Before modification strList5: [" + strList5 + "]");
        ListTruncateEndTest.removeRange(strList5, 5);
        System.out.println("After modification strList5: [" + strList5 + "]");
    } catch (Exception e) {
        System.out.println("Error: [" + e.toString() + "]");
    }
}

Before modification strList1: [[]]
After modification strList1: [[]]
Before modification strList2: [[one, two, three]]
After modification strList2: [[one, two, three]]
Before modification strList3: [[one, two, three, four, five]]
After modification strList3: [[one, two, three, four, five]]
Before modification strList4: [[one, two, three, four, five, six]]
Clearing out sublist: [[six]]
Error: [java.lang.UnsupportedOperationException]

我清除子列表的方式有问题吗?或者这是 Java 8 中的错误? 我在 Mac 上的 Java 8 版本是: java版本“1.8.0_45” Java(TM) SE 运行时环境 (build 1.8.0_45-b14) Java HotSpot(TM) 64 位服务器 VM(内部版本 25.45-b02,混合模式)

【问题讨论】:

  • 您也可以考虑打印出异常 ex.printStackTrace() 的堆栈跟踪,而不仅仅是消息。

标签: java list


【解决方案1】:

Arrays.asList 返回的列表是固定长度的,因此在 subLists 上调用 clear 会引发 UnsupportedOperationException

您需要改用ArrayList

List<String> strList2 = new ArrayList<>(Arrays.asList("one", "two", "three"));

【讨论】:

  • 感谢 Paul,当我使用 new ArrayList 并向其中添加元素时,我没有收到与您的答案匹配的错误。你在我发现之前发布了答案,所以你得到了它的功劳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2021-01-02
  • 1970-01-01
  • 2020-04-13
  • 2018-04-27
  • 2021-03-07
相关资源
最近更新 更多