You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:09:03