本文主要是介绍日常开发对象判空 + 避免空指针异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 字符串:StringUitils
- StringUtils.isEmpty(CharSequence cs)
- StringUtils.isNotEmpty(CharSequence cs)
- StringUtils.isAnyEmpty(CharSequence... css)
- StringUtils.isNoneEmpty(CharSequence... css)
- StringUtils.isBlank(CharSequence cs)
- StringUtils.isNotBlank(CharSequence cs)
- StringUtils.isAnyBlank(CharSequence... css)
- StringUtils.isNoneBlank(CharSequence... css)
- 集合:CollectionUtils
- isEmpty(Collection coll)
- isNotEmpty(Collection<?> collection)
- 映射:MapUtils
- isEmpty(Map<?, ?> map)
- isNotEmpty(Map<?, ?> map)
- 对象:Objects
- isNull(Object obj)
- nonNull(Object obj)
- requireNonNull(T obj)
- requireNonNull(T obj, String message)
- requireNonNull(T obj, Supplier<String> messageSupplier)
- Optional
- Optional.ofNullable(T value)
- Optional.isPresent()
- Optional.ifPresent(Consumer<? super T> consumer)
- Optional.get()
- Optional.orElse(T other)
- Optional.orElseGet(Supplier<? extends T> supplier)
- Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
- Optional.flatMap(Function<? super T, Optional<U>> mapper)
- Optional.filter(Predicate<? super T> predicate)
字符串:StringUitils
Apache Commons Lang 库相关依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 请使用最新或适合项目的版本 -->
</dependency>
StringUtils.isEmpty(CharSequence cs)
StringUtils.isEmpty()
用来检查一个字符串是否为空。这里的“空”是指它要么是 null
,要么长度为零(即没有包含任何字符)。这个方法通常用于验证和检查字符串变量在使用之前是否已经被赋值或避免在处理字符串时出现 NullPointerException
。
相关源码:
public static boolean isEmpty(CharSequence cs) {return cs == null || cs.length() == 0;
}
StringUtils.isNotEmpty(CharSequence cs)
相关源码:
public static boolean isNotEmpty(CharSequence cs) {return !isEmpty(cs);
}
StringUtils.isNotEmpty()
方法用于检查字符串是否非空。如果字符串不为 null
并且至少包含一个非空白字符,该方法返回 true
。相对于直接检查 !StringUtils.isEmpty(input)
,使用 isNotEmpty()
可以使代码更易读。
StringUtils.isAnyEmpty(CharSequence… css)
StringUtils.isAnyEmpty()
方法接收一个可变数量的 CharSequence
参数(例如 String
对象),检查传入的字符串数组中是否有任何一个为空,满足则返回 true
。
相关源码:
public static boolean isAnyEmpty(CharSequence... css) {// 空数组默认不成立if (ArrayUtils.isEmpty(css)) {return false;} else {CharSequence[] var1 = css;int var2 = css.length;// 循环遍历每个字符串,调用 isEmpty() 方法检查它们是否为空(null 或 "")for(int var3 = 0; var3 < var2; ++var3) {CharSequence cs = var1[var3];// 如果任何一个字符串为空(null 或 ""),立即返回 trueif (isEmpty(cs)) {return true;}}// 如果所有字符串都非空(null 或 ""),返回 falsereturn false;}
}
StringUtils.isNoneEmpty(CharSequence… css)
StringUtils.isNoneEmpty()
用于检查一组字符串(CharSequence
的可变参数)中是否没有任何一个字符串是空的。如果所有传入的字符串都是非空的(既不是 null
,也不是空字符串 “”),则返回 true
;否则,如果有任何一个字符串为空,则返回 false
。
相关源码:
public static boolean isNoneEmpty(CharSequence... css) {return !isAnyEmpty(css);
}
StringUtils.isBlank(CharSequence cs)
StringUtils.isBlank()
用来检查传入的 CharSequence
(例如一个 String
对象)是否为空白。空白是指字符串为 null
、长度为零(空字符串)或者仅包含空格或任何类型的空白字符(例如制表符、换行符等)。如果满足上述任一条件,则此方法返回 true
。
相关源码:
public static boolean isBlank(CharSequence cs) {// 获取字符串的长度int strLen = length(cs);// 如果长度为 0,即字符串为 null 或空字符串,直接返回 trueif (strLen == 0) {return true;} else {// 遍历字符串中的每个字符. 如果字符串中存在非空白字符,则返回 falsefor(int i = 0; i < strLen; ++i) {if (!Character.isWhitespace(cs.charAt(i))) {return false;}}return true;}
}
StringUtils.isNotBlank(CharSequence cs)
对于 StringUtils.isNotBlank()
,这个 API 正好是 isBlank()
的逻辑相反版:
- 如果传入的
CharSequence
不为空白,即它不是null
、不是长度为零的字符串,且至少包含一个非空白字符,那么isNotBlank()
返回true
。 - 如果字符串是空白的,那么
isBlank()
返回true
,因此isNotBlank()
会返回false
。
相关源码:
public static boolean isNotBlank(CharSequence cs) {return !isBlank(cs);
}
StringUtils.isAnyBlank(CharSequence… css)
StringUtils.isAnyBlank()
用来检查传入的字符串序列中是否存在任何一个空白的字符串。这里,空白的定义与 StringUtils.isBlank()
相同,即字符串可能是 null
、空字符串 (“”),或者仅包含空格或其他空白字符。
相关源码:
public static boolean isAnyBlank(CharSequence... css) {// 如果传入的字符串数组为 null 或其长度为 0,直接返回 falseif (ArrayUtils.isEmpty(css)) {return false;} else {CharSequence[] var1 = css;int var2 = css.length;for(int var3 = 0; var3 < var2; ++var3) {CharSequence cs = var1[var3];// 调用 isBlank 检查当前字符串,如果发现任何一个字符串为空白,返回 trueif (isBlank(cs)) {return true;}}// 遍历完成后,没有找到空白的字符串,返回falsereturn false;}
}
StringUtils.isNoneBlank(CharSequence… css)
StringUtils.isNoneBlank()
则是对 isAnyBlank()
的逻辑取反,检查字符串序列中是否全部字符串都不是空白的。
相关源码:
public static boolean isNoneBlank(CharSequence... css) {return !isAnyBlank(css);
}
集合:CollectionUtils
Apache Commons Collections4 库相关依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version> <!-- 请使用最新或适合项目的版本 -->
</dependency>
isEmpty(Collection coll)
检查传入的集合是否为空,即它会检查集合是否为 null
或者是否不包含任何元素。
相关源码:
public static boolean isEmpty(Collection coll) {return (coll == null || coll.isEmpty());
}
isNotEmpty(Collection<?> collection)
检查传入的集合是否非空,即它是 isEmpty()
方法的逻辑相反。如果集合不是 null
且至少包含一个元素,则返回 true
。
相关源码:
public static boolean isNotEmpty(Collection coll) {return !CollectionUtils.isEmpty(coll);
}
映射:MapUtils
Apache Commons Collections4 库相关依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version> <!-- 请使用最新或适合项目的版本 -->
</dependency>
isEmpty(Map<?, ?> map)
检查传入的 Map 是否为空,即它检查 Map 是否为 null
或者是否不包含任何键值对(entry)。
相关源码:
public static boolean isEmpty(Map<?, ?> map) {return map == null || map.isEmpty();
}
isNotEmpty(Map<?, ?> map)
检查传入的 Map 是否非空,即它是 isEmpty()
的逻辑相反。如果 Map 不是 null
且至少包含一个键值对,则返回 true
。
相关源码:
public static boolean isNotEmpty(Map<?, ?> map) {return !isEmpty(map);
}
对象:Objects
在 Java 标准库中,java.util.Objects
类提供了一些静态工具方法,用于协助进行对象比较、生成哈希码、返回字符串表示形式或者处理 null 值。
isNull(Object obj)
检查指定对象是否为 null
。如果是,则返回 true
;否则返回 false
。
相关源码:
public static boolean isNull(Object obj) {return obj == null;
}
nonNull(Object obj)
检查指定对象是否不为 null
。如果不是,则返回 true
;否则返回 false
。
相关源码:
public static boolean nonNull(Object obj) {return obj != null;
}
requireNonNull(T obj)
检查指定的对象引用不为 null
。如果为 null
,则抛出 NullPointerException
。
相关源码:
public static <T> T requireNonNull(T obj) {if (obj == null)throw new NullPointerException();return obj;
}
requireNonNull(T obj, String message)
检查指定的对象引用不为 null
,并且可以提供如果对象为 null
时抛出的异常信息。
相关源码:
public static <T> T requireNonNull(T obj, String message) {if (obj == null)throw new NullPointerException(message);return obj;
}
requireNonNull(T obj, Supplier messageSupplier)
与上一个方法类似,但是它允许你提供一个消息提供者 Supplier
接口,只有在对象为 null
,需要抛出异常时才会调用。
相关源码:
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {if (obj == null)throw new NullPointerException(messageSupplier.get());return obj;
}
Optional
Java 8 引入了 java.util.Optional<T>
类,提供了一种新的模式来避免空指针异常。Optional
是一个容器对象,它可能包含也可能不包含非 null
的值。如果值存在,则 isPresent()
方法将返回 true
,调用 get()
方法将返回该值。
Optional.ofNullable(T value)
创建一个包含给定值的 Optional
,如果指定的值为 null
,则创建一个空的 Optional
。
相关源码:
public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}public static <T> Optional<T> of(T value) {return new Optional<>(value);
}
使用示例:
Optional<String> optional = Optional.ofNullable(stringValue);
Optional.isPresent()
如果存在非 null
的值,则返回 true
。
相关源码:
public boolean isPresent() {return value != null;
}
使用示例:
if (optional.isPresent()) { /* value is not null */ }
Optional.ifPresent(Consumer<? super T> consumer)
如果值存在,调用指定的消费者 Consumer
接口的实现。
相关源码:
public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);
}
使用示例:
optional.ifPresent(value -> System.out.println("Value is: " + value));
Optional.get()
如果值存在,则返回值,否则抛出 NoSuchElementException
。
相关源码:
public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;
}
使用示例:
String value = optional.get();
Optional.orElse(T other)
如果值存在,则返回该值,否则返回传递给它的参数 other
。
相关源码:
public T orElse(T other) {return value != null ? value : other;
}
使用示例:
String value = optional.orElse("Default Value");
Optional.orElseGet(Supplier<? extends T> supplier)
如果值存在,返回值,否则调用 Supplier
接口的实现并返回其执行结果。
相关源码:
public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();
}
使用示例:
String value = optional.orElseGet(() -> getDefault());
Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)
如果值存在,返回值,否则抛出由提供的 Supplier
接口生成的异常。
相关源码:
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}
}
使用示例:
String value = optional.orElseThrow(IllegalStateException::new);
Optional.flatMap(Function<? super T, Optional> mapper)
如果值存在,返回应用提供的映射函数的结果,否则返回空的 Optional
。
相关源码:
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Objects.requireNonNull(mapper.apply(value));}
}
使用示例:
Optional<Detail> detailOptional = userOptional.flatMap(User::getDetailOptional);
Optional.filter(Predicate<? super T> predicate)
如果值存在,并且符合给定的 Predicate
,则返回包含该值的 Optional
,否则返回空的 Optional
。
相关源码:
public Optional<T> filter(Predicate<? super T> predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();
}
使用示例:
Optional<String> filtered = optional.filter(s -> s.length() > 3);
这篇关于日常开发对象判空 + 避免空指针异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!