从列表中删除所有元素引发java.lang.UnsupportedOperationException异常

3

我想将successList设置为[10,14],我尝试的方法是:

String oneStr = "10,11,12,14";
String twoStr = "11,14";

Returns r = new Returns();

r.setFailureList(Arrays.asList(twoStr.split(",")));
r.setSuccessList(Arrays.asList(oneStr.split(",")));

r.getSuccessList().removeAll(r.getFailureList());
System.out.println(r.getSuccessList());

返回类是指,

List<String> successList;
List<String> failureList;


public List<String> getSuccessList() {
    return successList;
}
public void setSuccessList(List<String> successList) {
    this.successList = successList;
}
public List<String> getFailureList() {
    return failureList;
}
public void setFailureList(List<String> failureList) {
    this.failureList = failureList;
}
public void setFailureList(ArrayList<String> failureList) {
    this.failureList = failureList;
}

导致 java.lang.UnsupportedOperationException 的堆栈跟踪如下:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(Unknown Source)
    at java.util.AbstractList$Itr.remove(Unknown Source)
    at java.util.AbstractCollection.removeAll(Unknown Source)

1
可能是因为你得到的 successlist 是一个不可修改的列表,就像这里提到的一样:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#unmodifiableList(java.util.List)。 - Karthik Kalyanasundaram
1
@KarthikKalyanasundaram 哦。"在显而易见的地方由文档回答"。我取消了我的点赞。但我认为这是一个很好的问题,不应该被踩。 - John Dvorak
1
@JanDvorak 我没有投下票 :) - Karthik Kalyanasundaram
@JanDvorak 我的问题格式不正确,为什么要点踩? - Rakesh KR
@RakeshKR 嗯,我没有投反对票。你怎么会认为我投了反对票,尽管我说这个问题不值得反对?我只是取消了赞同,因为这些方法的文档中已经回答了这个问题,我认为这个问题不会有用(但我可能错了)。 - John Dvorak
@JanDvorak 我明白了,谢谢您的评论... :-) - Rakesh KR
2个回答

14

来自asList()文档

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

因此,当您直接修改该列表(添加、删除等)时,会出现异常

但是,在以下情况下:

   new ArrayList<String>(Arrays.asList(twoStr.split(",")))

在这里,你不是直接引用 list。你正在创建一个新的 ArrayList 并使用由 Arrays.asList(twoStr.split(",")) 返回的列表数据(该列表的大小不是 Unmodifiable)。


1

改变

r.setFailureList(Arrays.asList(twoStr.split(",")));
r.setSuccessList(Arrays.asList(oneStr.split(",")));

as

r.setFailureList(new ArrayList<String>(Arrays.asList(twoStr.split(","))));
r.setSuccessList(new ArrayList<String>(Arrays.asList(oneStr.split(","))));

1
new ArrayList<String>(twoStr.split(",")) 这个怎么样? - John Dvorak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接