如何向List<List<String>>的内层List<String>指定位置添加元素并解决异常
异常出现原因
java.lang.UnsupportedOperationException 本质是你操作的内层List不支持add修改操作,常见触发场景如下:
- 存入
finalInfo的第一个内层List是不可变集合实例:比如用JDK9+的List.of()方法生成的集合、Arrays.asList()返回的固定长度集合,二者的实现类都没有实现add/remove这类修改方法,调用就会抛出该异常。 - 内层List被
Collections.unmodifiableList()包装成了只读视图,任何修改操作都会被拦截抛出异常。
注:如果是
finalInfo为空、内层List未初始化的情况,会抛出NullPointerException而非当前异常,可排除该场景。
解决方案
根据你的业务场景选择对应处理方式即可:
- 存入内层List时直接使用可变实现
往finalInfo添加内层List时,将不可变集合转为java.util.ArrayList再存入:
// 错误写法,存的是不可变集合 // finalInfo.add(List.of("a","b","c","d")); // 正确写法,转成可变ArrayList finalInfo.add(new ArrayList<>(List.of("a","b","c","d"))); // 如果是Arrays.asList生成的集合同理 // finalInfo.add(new ArrayList<>(Arrays.asList(arr)));
直接存入可变集合后,你原来的插入代码就可以正常运行。
- 无法修改存入逻辑时,操作前先转可变集合
如果你没法修改finalInfo的内层List生成逻辑,可以在插入元素前手动转换:
// 取出原内层List List<String> originalInner = finalInfo.get(0); // 转为可变的ArrayList List<String> mutableInner = new ArrayList<>(originalInner); // 插入前先校验索引合法性,避免下标越界 if (mutableInner.size() >= 4 && tempInfo.get(0).size() >= 5) { mutableInner.add(4, tempInfo.get(0).get(4)); } // 替换回finalInfo finalInfo.set(0, mutableInner);
内容的提问来源于stack exchange,提问作者javzuk
相关产品推荐
相关产品推荐

