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

如何避免枚举(Enum)使用过程中抛出NullPointerException空指针异常

问题根因

空指针异常并非出自orNull()后的匹配逻辑,Guava的Enums.getIfPresent方法对输入的查找字符串有强制非空校验,当传入的mood为null时,方法内部会先抛出NPE,根本不会执行到后续的orNull()以及匹配逻辑。

修复方案

  • 优先对入参mood做非空、非空白校验,无效值直接返回false,避免进入后续枚举查找逻辑
  • 优化判断逻辑:先统一转换得到枚举实例,再用Set的contains方法直接判断,无需遍历流重复执行枚举查找,性能更优

修复后代码

import com.google.common.base.Enums;
import com.google.common.base.Strings;
import com.google.common.collect.Sets;
import java.util.Set;

public enum KnowYourMoodEnum {
    ANGRY, SAD, HAPPY, FEELING_GOOD;
    
    private static final Set<KnowYourMoodEnum> HAPPY_MOOD_LIST = Sets.newHashSet(HAPPY, FEELING_GOOD);
    private static final Set<KnowYourMoodEnum> UPSET_MOOD_LIST = Sets.newHashSet(ANGRY, SAD);
    
    public static boolean isHappyMood(String mood) {
        // 入参无效直接返回false,也可自行替换为原生非空判断:if (mood == null || mood.isEmpty())
        if (Strings.isNullOrEmpty(mood)) {
            return false;
        }
        KnowYourMoodEnum targetMood = Enums.getIfPresent(KnowYourMoodEnum.class, mood).orNull();
        return targetMood != null && HAPPY_MOOD_LIST.contains(targetMood);
    }
    
    public static boolean isUpsetMood(String mood) {
        if (Strings.isNullOrEmpty(mood)) {
            return false;
        }
        KnowYourMoodEnum targetMood = Enums.getIfPresent(KnowYourMoodEnum.class, mood).orNull();
        return targetMood != null && UPSET_MOOD_LIST.contains(targetMood);
    }
    
}

可选优化

如果业务需要支持大小写不敏感的枚举匹配,可以在调用Enums.getIfPresent前先对mood做格式化处理,比如:mood.trim().toUpperCase()

内容的提问来源于stack exchange,提问作者mitali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:06:01