您可以从类名中看到properties.stringPropertyNames()返回一个Collections$ unmodiablelecollection。不可修改的意思是你不能在这个集合上添加、插入、删除或改变一些东西
既然您已经解释了properties
是什么类型的java.util.Properties
,答案就很清楚了。在Java 8中,Properties.stringPropertyNames()
返回一个未指定可修改性的集合:
"返回此属性列表中的一组键,其中键及其对应的值是字符串,如果在主属性列表中没有找到同名的键,则在默认属性列表中包括不同的键。省略键或值不是字符串类型的属性。">
"返回的集合不受Properties对象支持。此属性的更改不会反映在集合中,反之亦然。">。
在Java 11中,它被指定为不可修改的
"从这个属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串,如果在主属性列表中没有找到同名的键,则在默认属性列表中包括不同的键。省略键或值不是字符串类型的属性。">
"返回的集合不受此属性对象支持。对此属性对象的更改不会反映在返回的集合中。">
这个变化发生在Java 9中。这与错误8059361有关。
(这是一个不兼容的更改,因为如果客户依赖于能够修改返回集,它可能会破坏客户的代码。然而,这些代码依赖于未指定的行为,所以你可以说它已经被破坏了。
根据我的理解,您的设置是不可修改的,而您想在这里更改它
parameterNames.removeIf(s -> !s.startsWith(seq));
这就是为什么你得到这个错误/异常。
Set<String> parameterNames = new HashSet<>(properties.stringPropertyNames());
这将创建一个新的集合,内容相同,可以修改。