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

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对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio