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

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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3