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

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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者