日常开发对象判空 + 避免空指针异常

2024-02-09 06:36

本文主要是介绍日常开发对象判空 + 避免空指针异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 字符串: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);

这篇关于日常开发对象判空 + 避免空指针异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693398

相关文章

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.