从JDK8迁移至JDK11触发java.lang.UnsupportedOperationException如何解决?
JDK8迁移至JDK11时
Properties.stringPropertyNames()抛出UnsupportedOperationException解决方案 问题根因
从JDK9版本开始,
java.util.Properties的stringPropertyNames()方法返回值被调整为Collections$UnmodifiableCollection类型的不可变集合,JDK8版本中该方法返回的是可修改的集合实例,该API实现变更是跨版本升级时触发运行时异常的核心原因。
可行解决方案
方案1:转储到可修改集合后操作(兼容全JDK版本)
将返回的不可变集合复制到HashSet、ArrayList等原生可修改集合实例后,再执行增删改操作,示例代码:// 错误写法(JDK11+直接抛异常) // Set<String> propKeys = properties.stringPropertyNames(); // propKeys.remove("deprecated.key"); // 兼容写法 Set<String> propKeys = new HashSet<>(properties.stringPropertyNames()); propKeys.remove("deprecated.key"); // 后续业务逻辑处理该方案适配性最高,无需区分运行环境JDK版本。
方案2:直接操作Properties实例(性能最优)
若需求是新增、删除属性键值对,直接调用Properties自带的put()/remove()方法即可,无需通过stringPropertyNames()返回的集合间接操作:// 新增属性 properties.put("new.business.key", "configValue"); // 删除旧属性 properties.remove("obsolete.key");该方案不需要额外创建集合副本,性能损耗最低。
方案3:替换遍历方式(仅需读取属性场景)
如果只需要遍历所有属性键做读取操作,不需要修改集合,也可直接使用properties.keySet()遍历,若存在非String类型的属性键,需自行补充类型校验逻辑。
内容的提问来源于stack exchange,提问作者Mutahir Kiani
相关产品推荐
相关产品推荐

