《Java高并发 & 微服务 & 性能调优实战案例 100讲》
空指针异常是出现频率比较高的bug,在出现空指针时,很多小伙伴都是习惯性地加一个 !=null 的判断,这个bug就解决了。
当代码中频繁出现 !=null 的判断时,我们就会很头疼,能不能高效、优雅地做这个判断?
答案当然是可以的。
第一步,当我们要做 !=null 的判断时,请停顿一下,看一下我们要做判断的这个数据是什么类型?
数据类型无非就是String字符串、Object/自定义对象、List集合、Array数组、Map集合等类型。
第二步,思考这个数据类型对应的工具类有哪些?
String类型,对应的工具类有StringUtils。
Object对象,对应的工具类有ObjectUtils。
Array数组,对应的工具类有Arrays。
List集合、Map集合对应的工具类有Collections、CollectionUtils等。
这些工具类都是Java、Spring框架自带的工具类。
第三步,使用对应类型的工具类做判断。
1、如果这个数据是String类型时,请使用StringUtils工具类。
String str = "";
StringUtils.isEmpty(str); // true
public static boolean isEmpty(@Nullable Object str) {
return str == null || "".equals(str);
}
Object obj = null;
ObjectUtils.isEmpty(obj); // true
Map<String,Object> map = Collections.emptyMap();
ObjectUtils.isEmpty(map);// true
List<Integer> list =Collections.EMPTY_LIST;
ObjectUtils.isEmpty(list); // true
// 数组
Object[] objArr = null;
ObjectUtils.isEmpty(objArr); // true
public static boolean isEmpty(@Nullable Object obj) {
// 判断obj是否为null,如果是直接f
if (obj == null) {
return true;
}
// 判断obj是否是Optional的子类
if (obj instanceof Optional) {
// 如果是,则调用isPresent方法判断是否为null
return !((Optional) obj).isPresent();
}
// 判断obj是否是CharSequence的子类
if (obj instanceof CharSequence) {
// 如果是,则获取长度,长度等于0时,就认为这个obj是空字符串
return ((CharSequence) obj).length() == 0;
}
// 判断obj是否为数组
if (obj.getClass().isArray()) {
// 数组的长度等于0就认为这个数组是空数组
return Array.getLength(obj) == 0;
}
// 判断obj是否为Collection集合的子类
if (obj instanceof Collection) {
// 用Collection子类的isEmpty方法判断集合是否为空
return ((Collection) obj).isEmpty();
}
// 判断obj是否为Map接口的子类
if (obj instanceof Map) {
// 如果是,则进行强转,并用子类的isEmpty方法判断集合是否为空
return ((Map) obj).isEmpty();
}
// else
return false;
}
// 创建一个只有一个元素的List集合
List<Integer> list = Collections.singletonList(null);
ObjectUtils.isEmpty(list); // false
public static boolean isEmpty(@Nullable Object[] array) {
return array == null || array.length == 0;
}
Arrays.stream(list.toArray()).allMatch(ObjectUtils::isEmptyisNull);
Map<String,Object> map = Collections.emptyMap();
CollectionUtils.isEmpty(map);
public static boolean isEmpty(@Nullable Map<?, ?> map) {
return map == null || map.isEmpty();
}
List<Integer> list = null;
// 使用CollectionUtils工具类判断list集合是否为空
CollectionUtils.isEmpty(list); // true
public static boolean isEmpty(@Nullable Collection<?> collection) {
return collection == null || collection.isEmpty();
}