如何避免枚举(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
相关产品推荐
相关产品推荐

