从 JDK8 迁移到 JDK11 导致 java.lang.UnsupportedOperationException
我正在将我的一个项目从 JDK8 迁移到 JDK11,但是其中一个单元测试失败了,尽管我想出了如何在 JDK11 中解决此问题的解决方案,但我不知道其背后的原因。如果有人向我解释这一变化,我真的很感激。这是适用于 JDK8 但不适用于 JDK11 的 HashSet:
Set<String> func(Properties p, String s) {
Set<String> set = p.stringPropertyNames();
set.removeIf(s -> !s.startsWith(s));
return set;
}
我不得不像这样更改 HashSet 初始化以使我的测试运行并通过 JDK11:
Set<String> set = new HashSet<>(p.stringPropertyNames());
我不明白为什么我必须在 JDK11 中像这样更改初始化,此更改是否打算在 JDK11 中使用?
错误堆栈跟踪:
null
java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableCollection.removeIf(Collections.java:1089)
回答
既然您已经解释了类型properties是什么java.util.Properties,答案就很清楚了。在 Java 8 中,Properties.stringPropertyNames()返回一个未指定可修改性的集合:
“返回的集合不受属性对象的支持。对此属性的更改不会反映在集合中,反之亦然。” .
在 Java 11 中,它被指定为不可修改。
“返回的集合不受此 Properties 对象的支持。对此 Properties 对象的更改不会反映在返回的集合中。”
更改发生在 Java 9 中。这与错误 8059361相关。
(这是一个不兼容的更改,如果客户依赖于能够修改返回的集合,它可能会破坏客户的代码。但是,该代码依赖于未指定的行为,因此您可以争辩说它已经被破坏了。)
THE END
二维码