从JDK8迁移到JDK11导致java.lang.UnsupportedOperationException



您可以从类名中看到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());

这将创建一个新的集合,内容相同,可以修改。

相关内容

最新更新