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

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

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Rust 智能指针的使用详解

《Rust智能指针的使用详解》Rust智能指针是内存管理核心工具,本文就来详细的介绍一下Rust智能指针(Box、Rc、RefCell、Arc、Mutex、RwLock、Weak)的原理与使用场景,... 目录一、www.chinasem.cnRust 智能指针详解1、Box<T>:堆内存分配2、Rc<T>:

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返