HashMap集合的map.values()返回的Collection集合执行add方法报空指针问题

发布时间 2023-11-16 11:04:17作者: 不爱学习的摆烂王

一、方法1、

    private Collection<String> setPermissionTenant(List<SysPermission> ls, int tenantId) {
        // 循环两次 第一次设置ID和tenantId 第二次设置pid
        Map<String, String> map = new HashMap<>();
        for (SysPermission p : ls) {
            String oldId = p.getId();
            String newId = randomId();
            map.put(oldId, newId);
            p.setId(newId);
            p.setTenantId(tenantId);
            p.setCreateBy(null);
            p.setCreateTime(null);
            p.setUpdateBy(null);
            p.setUpdateTime(null);
        }
        for (SysPermission p : ls) {
            String oldPid = p.getParentId();
            if (oConvertUtils.isNotEmpty(oldPid)) {
                String newPid = map.get(oldPid);
                if (oConvertUtils.isNotEmpty(newPid)) {
                    p.setParentId(newPid);
                }
            }
        }
        return map.values();
    }

方法2调用方法1

private void test () {
    Collection<String> menuIds = setPermissionTenant(ls,Integer.parseInt(tenantId));
    menuIds.add("123456")
}
//向 Collection<String> 类型的集合中添加数据的方式取决于具体的集合实现。在 Java 中,常见的 Collection 接口的实现包括 ArrayListLinkedListHashSet
//所以这里add这样写没问题.

二、运行程序,抛出NULL空指针,排查原因得到:

在 Java 中,Map.values() 返回的是一个 Collection 视图,但是这个视图是不支持直接添加元素的。这是因为 values() 返回的是对原始映射值的视图,对视图的修改会反映在原映射中,但是不能直接添加新元素。如果尝试使用 add 方法,可能会得到 UnsupportedOperationException 异常。

三、解决办法,把他转化成可操作的集合

// 转换map.values()为ArrayList
List<String> valuesList = new ArrayList<>(map.values());

// 向ArrayList中添加新元素
valuesList.add("123");

四、再启动程序,不报错啦!