set集合add(),空指针异常处理

本文介绍了一次因未初始化Set集合而导致的空指针异常经历。通过具体代码示例展示了错误的发生,并提供了正确的初始化方法来避免此类问题。

操作逻辑的时候,使用了set集合,但是出现了空指针,排除了很久,发现有一个低级错误,没有初始化set,导致没有set对象,所以无法使用set的方法

  Set<String> starHeadUrl = null;

        //如果超过三个,就显示前三个,如果不够三个,就全部显示
        if(listAllFriendsVos1.isPresent()){
            List<AppendMomentStarVo> listAllNOFriendsVos = listAllFriendsVos1.get();
            int i = listAllNOFriendsVos.size();

            Map<String, AppendMomentStarVo> collect =
                    listAllNOFriendsVos.stream().collect(Collectors.toMap(AppendMomentStarVo::getHeadurl,
                            Function.identity(),(key1, key2) -> key2));

            int count = configLogic.getValue2Integer(ConfigLogic.COUNT_STAR_HEADURL);
            logger.info("listNOMomentstar:count{}::i{}",count,i);
            if(i<=count){
                starHeadUrl = collect.keySet();
            }else{
                Set<String> set = collect.keySet();
                String[] arr = new String[set.size()];
                String[] strings = set.toArray(arr);
                logger.info("string.length:{}",strings.length);
                starHeadUrl = new TreeSet<>();
                for (int a=0;a<count;a++){
                    starHeadUrl.add(strings[a]);
                }
            }

错误的地方:
这里写图片描述
如果在【2】位置没有初始化set,,那么,在添加的时候会出现空指针,因为这个时候的set是null,没有初始化,所以对象不存在,是空的!!!!!
在初始化了set之后,就可以正常添加了。

引以为戒!!!!!!

<think>首先,用户的问题是:“我想检查Set集合是否为空 请问如何判断Set集合是否为空”。这直接对应到引用中的内容,特别是引用[2]、[3]、[4]和[5],这些都在讨论如何判断Set是否为空。 关键点: - 判断Set是否为空:使用`isEmpty()`方法。 - 引用[2]提到:`boolean isEmpty();` 判断集合是否为空不包含任何元素。 - 引用[3]:`Set<String> set = new HashSet<>(); System.out.println(set.isEmpty()); //true` - 引用[4]:`Set<String> set = new HashSet<String>(); System.out.println("set为空:" + set.isEmpty());` - 引用[5]提到迭代器,但主要是关于删除操作,不是直接相关。 此外,引用[3]比较了不同方法: - 方法一:`if(list != null && list.size() > 0)` – 效率较低,因为`size()`可能遍历整个集合。 - 方法二:`if(list != null && !list.isEmpty())` – 效率更高,因为`isEmpty()`通常直接检查内部状态。 对于Set,同样适用:优先使用`isEmpty()`而不是`size() == 0`。 现在,系统指令: - 所有行内数学表达式用`$...$`格式,但这里没有数学表达式。 - 独立公式用`$$...$$`,但问题不涉及数学。 - LaTeX语法正确:确保代码块正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 回答结构: - 清晰、逐步解决问题。 - 保证真实可靠,基于引用。 - 引用末尾添加标识。 生成相关问题: - 在回答后,添加“§§相关问题§§”部分,列出相关问题。 回答内容: 1. 介绍如何判断Set是否为空。 2. 推荐使用`isEmpty()`方法。 3. 解释为什么它更高效。 4. 提供代码示例。 5. 引用相关部分。 代码示例: - 使用Java代码,因为引用都是Java相关的。 - 如引用[3]和[4]中的例子。 完整回答: - 开头:直接回答用户问题。 - 主体:解释方法,提供示例。 - 结尾:总结。 - 然后添加相关问题。 相关问题: - 基于主题,如: 1. 如何判断其他集合类型(如List、Map)是否为空? 2. `isEmpty()`和`size() == 0`哪个更高效? 3. 在并发环境下如何安全地检查集合是否为空? 4. Set集合的常见操作有哪些? 5. 如何优化集合操作性能? 参考引用: - 在回答中,当提到特定点时,添加引用标识,如[^2]。 最终输出结构: 1. 回答部分。 2. 代码块(如果需要)。 3. §§相关问题§§ 列表。</think>### 如何判断 Set 集合是否为空 在 Java 中,判断 Set 集合是否为空非常简单且高效。主要方法是使用 `isEmpty()`,它直接检查集合是否不包含任何元素。以下是详细步骤和解释: 1. **使用 `isEmpty()` 方法**: - `isEmpty()` 是 `java.util.Set` 接口的内置方法,返回一个布尔值: - 如果 Set 为空(即不包含任何元素),返回 `true`。 - 如果 Set 不为空(包含至少一个元素),返回 `false`。 - 示例代码: ```java import java.util.HashSet; import java.util.Set; public class SetExample { public static void main(String[] args) { // 创建一个空的 Set Set<String> set = new HashSet<>(); // 判断 Set 是否为空 if (set.isEmpty()) { System.out.println("Set 为空"); } else { System.out.println("Set 不为空"); } // 添加元素后再次检查 set.add("元素"); if (!set.isEmpty()) { System.out.println("Set 现在不为空"); } } } ``` 输出: ``` Set 为空 Set 现在不为空 ``` 2. **为什么推荐 `isEmpty()` 而不是 `size() == 0`**: - `isEmpty()` 方法通常更高效,因为它直接检查集合的内部状态(如指针或计数器),而不需要计算所有元素的大小。这在大型集合中性能优势明显[^3]。 - 对比示例: ```java // 高效方法:使用 isEmpty() if (set != null && set.isEmpty()) { // 处理空集合 } // 低效方法:使用 size()(需遍历整个集合) if (set != null && set.size() == 0) { // 处理空集合 } ``` 在数据量大的场景下,`isEmpty()` 的性能优于 `size() == 0`[^3]。 3. **空指针安全的处理**: - 如果 Set 可能为 `null`,需要先检查非空: ```java if (set == null || set.isEmpty()) { System.out.println("Set 为空或未初始化"); } ``` 这样可以避免 `NullPointerException`。 4. **与其他集合类型的对比**: - 类似地,List 和 Map 也提供 `isEmpty()` 方法: - List:`list.isEmpty()` - Map:`map.isEmpty()` 这确保了代码一致性[^3][^4]。 **总结**: 判断 Set 是否为空的最佳实践是使用 `set.isEmpty()`,并结合非空检查(`set != null`)以确保健壮性。这种方法高效、简洁,适用于所有 Java 集合框架的实现(如 `HashSet`, `TreeSet` 等)[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值