【问题标题】:Migration from JDK8 to JDK11 causing java.lang.UnsupportedOperationException从 JDK8 迁移到 JDK11 导致 java.lang.UnsupportedOperationException
【发布时间】:2021-10-25 13:32:09
【问题描述】:

您可以从类名中看到 properties.stringPropertyNames() 返回一个 Collections$UnmodifiableCollection。不可修改意味着您不能在此集合中添加、插入、删除或更改某些内容

【问题讨论】:

  • properties.stringPropertyNames() 的实例化类型是什么?
  • 你可以从类名properties.stringPropertyNames()看到返回一个Collections$UnmodifiableCollection。不可修改意味着您无法在此集合中添加、插入、删除或更改某些内容。
  • 属性的类型是属性

标签: java collections java-8 hashset java-11


【解决方案1】:

既然您已经解释了properties 的类型是java.util.Properties,那么答案就很清楚了。在 Java 8 中,Properties.stringPropertyNames() 返回了一个未指定可修改性的集合:

"返回此属性列表中的一组键,其中键及其对应的值是字符串,如果尚未从主属性中找到同名键,则包括默认属性列表中的不同键列表。省略其键或值不是字符串类型的属性。"

“返回的集合不受属性对象的支持。对此属性的更改不会反映在集合中,反之亦然。”.

在 Java 11 中,它被指定为不可修改。

"从这个属性列表中返回一组不可修改的键,其中键及其对应的值是字符串,如果尚未从主目录中找到同名的键,则包括默认属性列表中的不同键属性列表。省略其键或值不是字符串类型的属性。"

“返回的集合不受此 Properties 对象的支持。对此 Properties 对象的更改不会反映在返回的集合中。”

变化发生在 Java 9 中。这与 bug 8059361 有关。

(这是一个不兼容的更改,因为如果客户依赖能够修改返回的集合,它可能会破坏客户的代码。但是,该代码依赖于未指定的行为,因此您可以争辩说它被破坏了已经。)

【讨论】:

  • 在 Java 8 中 Properties.stringPropertyNames() 返回了一个可修改的集合。 JavaDoc 中甚至提到了这一点(详细说明,对其进行修改对 Properties 实例没有影响)。
  • 是的,你是对的,我已经编辑了问题并在代码中添加了完整的功能。看看
  • @Robert - 这是一个集合是可修改的提示,但不可修改的集合将具有相同的属性。 (想一想。)
  • @Robert 谢谢你说得通。澄清我的观点。
【解决方案2】:

据我了解,您有不可修改的设置,您要在这里更改它

parameterNames.removeIf(s -> !s.startsWith(seq));

这就是您收到此错误/异常的原因。

Set<String> parameterNames = new HashSet<>(properties.stringPropertyNames());

这将创建一个具有相同内容且可以更改的新 Set。

【讨论】:

  • 是的,你是对的,我已经编辑了问题并在代码中添加了完整的功能。看看
  • @MutahirKiani 希望你现在对上面的帖子很干净。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2022-06-28
  • 2022-12-09
  • 2020-03-26
  • 1970-01-01
  • 2023-03-22
  • 2013-11-11
  • 2018-07-20
相关资源
最近更新 更多