Java 判空的常见方法

news2024/11/25 9:31:37

一、 对象判空

if (obj != null) {
    // 进行对象非空判断
}

Object obj = null; // 或者 obj = new Object();
if (obj == null) {
    // 对象为空
}

另外,Guava 库还提供了一个更方便的方法,使用方式如下:

import com.google.common.base.Objects;

if (Objects.isNull(obj)) {
    // 对象为空
}

二、 字符串判空

List<String> list = new ArrayList<>();
if (list == null || list.size() == 0) {
    // list 为空
}

简单,但需要写太多代码判断,会显得有些麻烦。或 使用 Apache Commons Lang3 提供的 判断字符串是否为空或者只包含空格字符。这种方式使用起来非常方便:

import org.apache.commons.lang3.StringUtils;

if (StringUtils.isBlank(str)) {
    // 字符串为空
}

还可采用  Java 8 引入的 String#isEmpty() 方法判断字符串是否为空字符串:

if (str == null || str.isEmpty()) {
    // 字符串为空
}

还有 Java 11 引入的 String#isBlank() 方法判断字符串是否为空或者只包含空格字符:

if (str == null || str.isBlank()) {
    // 字符串为空
}

 若还要 判断字符串是否为空或null:

String str = null; // 或者 str = "";
if (str == null || str.length() == 0 || str.trim().length() == 0) {
    // 字符串为空或null
}

也可以使用 Apache Commons Lang3 库中的 StringUtils 工具类中的 isBlank() 方法进行判断:

import org.apache.commons.lang3.StringUtils;

if (StringUtils.isBlank(str)) {
    // 字符串为空或null或只包含空白字符
}
直接使用 == 判断是否为 null,或使用 equals() 判断是否等于空字符串 "":
String str = null;
if (str == null || str.equals("")) {
    // 字符串为空
}
使用 isEmpty() 方法判断字符串是否为空字符串 "":
String str = "";
if (str.isEmpty()) {
    // 字符串为空
}
使用 isBlank() 方法判断字符串是否为空或全是空格:
String str = "   ";
if (StringUtils.isBlank(str)) {
    // 字符串为空或全是空格
}
使用正则表达式判断字符串是否为空或只包含空格:
String str = "    ";
if (str.matches("\\s*")) {
    // 字符串为空或只包含空格
}
需要注意的是,第三种方法需要导入 StringUtils 类,而第四种方法虽然不需要导入任何类,但比较麻烦,建议使用前三种方法中的一种。

三、 List 判空

        使用 if (list == null || list.isEmpty()) 判断 List 是否为 null 或者是否为空列表。或使用 Java 8 引入的 isEmpty() 方法判断 List 是否为 null 或者是否为空列表:但注意 isEmpty() 方法只会判断集合是否为空,而不会判断集合是否为 null。因此,使用 Collection#isEmpty() 方法之前,要先判断集合是否为 null。如果为 null,则该方法会抛出空指针异常。正确的使用方法如下:

List<Object> list = ...;
if (list != null && !list.isEmpty()) { // 先判断 list 是否为 null,再判断 list 是否为空
    // 进行操作
}

if (list == null || list.isEmpty()) {
    // List 为空
}

上述代码中,先使用 list!=null 来判断 list 是否为 null,如果是,则不会进入条件语句中。如果不是,则使用 !list.isEmpty() 来判断 list 是否为空,如果不为空,则进入条件语句中进行操作。

 

四、Map 判空

Map<String, String> map = null; // 或者 map = new HashMap<>();
if (map == null || map.isEmpty()) {
    // Map为空或null
}
private void putInfoToMap(Map<String,String> map ,String key ,String value){          
    if(StringUtils.isEmpty(key)){
            return;
    }
    if(StringUtils.isEmpty(value)){
            map.put(key, " ");
    }else{
            map.put(key, value);
       }
    }

 

 

 

五、数组判空

String[] array = null; // 或者 array = new String[10];
if (array == null || array.length == 0) {
    // 数组为空或null
}

六、Set判空

Set<String> set = null; // 或者 set = new HashSet<>();
if (set == null || set.isEmpty()) {
    // Set为空或null
}

        在判断集合、数组、对象是否为空时,进行非空判断时最好先判断对象是否存在,否则在对象不存在的情况下操作对象可能会导致空指针异常的发生。

七、文件判空

    public SalaryExcelOperatVo uploadExcel(MultipartFile multipartFile) {

        if (multipartFile==null) {
            log.error("文件不能为空");
             throw new RuntimeException("上传Excel文件内容为空,请重新上传!");
        }
        String fileName = multipartFile.getOriginalFilename();
        //判断文件是否是excel文件
        assert fileName != null;
        if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
            log.error(fileName + "不是Excel文件!");
            throw new RuntimeException(fileName + "不是Excel文件!");
        }

        //保存文件到本地
        File dir1 = new File("/roots/uploadFile/xzExcel");
        if (!dir1.exists()) {
            dir1.mkdirs();
        }
        //统一日期格式
        LocalDateTime current = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String formatted = current.format(formatter);
        //加上三位随机数
        Random random = new Random();
        int end3 = random.nextInt(999);

        File file1 = new File(dir1.getAbsolutePath() + File.separator + formatted + "-" + end3 + "-" + multipartFile.getOriginalFilename());
        try {
            multipartFile.transferTo(file1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        log.info("【上传薪资Excel文件已保存到本地:{}】",file1.getAbsolutePath());

        //创建返回对象SalaryExcelOperatVo的实例化对象: result
        SalaryExcelOperatVo result = new SalaryExcelOperatVo();
        //获取excel文件sheet1 的内容
        ArrayList<InSalary> inSalaries1 = readExcel1(file1.getAbsolutePath());

        ArrayList<SalaryStaffPerOneListVo> vo1 = new ArrayList<>();

        SalaryStaffPerOneListVo oneListVo ;

        for(InSalary inSalary1:inSalaries1){
            oneListVo = new SalaryStaffPerOneListVo();
            BeanUtils.copyProperties(inSalary1,oneListVo);
            vo1.add(oneListVo);
}
        result.setSheetOne(vo1);

        //获取excel文件sheet2 的内容
        ArrayList<InSalary> inSalaries2 = readExcel2(file1.getAbsolutePath());

        ArrayList<SalaryStaffPerTwoListVo> vo2 = new ArrayList<>();

        SalaryStaffPerTwoListVo twoListVo ;
        for(InSalary inSalary2:inSalaries2){
            twoListVo = new SalaryStaffPerTwoListVo();
            BeanUtils.copyProperties(inSalary2,twoListVo);
            vo2.add(twoListVo);
        }

        result.setSheetTwo(vo2);

        return result;
    }


八、StringUtils 工具类

        StringUtils 提供了许多字符串操作相关的方法,其中比较常用的包括 isEmpty、isNotEmpty、isBlank 和 isNotBlank,它们的作用如下:

  • isEmpty:判断字符串是否为 null 或长度是否为 0;
  • isNotEmpty:判断字符串是否不为 null 且长度不为 0;
  • isBlank:判断字符串是否为 null、空字符串或全为空格字符;
  • isNotBlank:判断字符串是否不为 null、不为空字符串且不全为空格字符。

isEmpty 和 isNotEmpty 是根据字符串的长度来判断的,而 isBlank 和 isNotBlank 还包括对空格字符的处理。另外,如果字符串为 null,无论使用哪个方法都会返回 true。

以下是 StringUtils.isEmpty、StringUtils.isNotEmpty、StringUtils.isBlank 和 StringUtils.isNotBlank 的源码实现(相对简化),可以更好地理解它们的区别:

public class StringUtils {
    // 判断字符串是否为空(长度是否为 0)
    public static boolean isEmpty(CharSequence cs) {
        return cs == null || cs.length() == 0;
    }

    // 判断字符串是否不为空(长度是否不为 0)
    public static boolean isNotEmpty(CharSequence cs) {
        return !isEmpty(cs);
    }

    // 判断字符串是否为空白(包括 null、空字符串和全为空格字符)
    public static boolean isBlank(CharSequence cs) {
        int length;
        if (cs == null || (length = cs.length()) == 0) {
            return true;
        }
        for (int i = 0; i < length; i++) {
            if (!Character.isWhitespace(cs.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    // 判断字符串是否不为空白(不包括 null、空字符串和全为空格字符)
    public static boolean isNotBlank(CharSequence cs) {
        return !isBlank(cs);
    }
}
private void validChoiceInfo(InSalary data, AnalysisContext context) {

    if(isBlank(data.getUserName())){
        throw new ExcelAnalysisException(String.format("上传失败:第%s行员工姓名为空",context.readRowHolder().getRowIndex()));
    }
    if(isBlank(data.getIdNumber())){
        throw new ExcelAnalysisException(String.format("上传失败:第%s行员工身份证信息为空",context.readRowHolder().getRowIndex()));
    }
}  


  
private void validChoiceInfo(InSalary data, AnalysisContext context) {

if(StrUtil.isBlank(data.getUserName())){
    throw new ExcelAnalysisException(String.format("上传失败:第%s行员工姓名为空",context.readRowHolder().getRowIndex()));
}
if(StrUtil.isBlank(data.getIdNumber())){
    throw new ExcelAnalysisException(String.format("上传失败:第%s行员工身份证信息为空",context.readRowHolder().getRowIndex()));
}
} 


        这两段代码实现的功能是一样的,都是对员工姓名和身份证信息进行非空判断,并在为空的情况下抛出异常。不同之处在于第一段代码使用了 isBlank() 方法,而第二段则使用了 StrUtil.isBlank() 方法。isBlank() 方法是在 JDK 11 中新增的,能够判断字符串是否为空或全为空格,因此不需要再使用 trim() 方法进行判断。而 StrUtil.isBlank() 方法是在 Hutool 库中提供的,功能与 isBlank() 类似,但需要将 Hutool 库引入项目中才能使用。另外,两段代码还有一个细微的差别。第一段代码使用了 if(isBlank(data.getUserName())) 的形式进行判断,而第二段代码使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。这两种写法的效果是一样的,只是调用方法的方式略有不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOLIDWORKS 30个实用小技巧

很多人在学习SolidWorks时&#xff0c;会有很多疑问&#xff0c;都不知道如何解答&#xff0c;所以走了很多弯路。今天&#xff0c;我们就来讲讲在学习SolidWorks中的那些小技巧吧&#xff01; 1、SOLIDWORKS技巧之按“空格键&#xff1a;”弹出快捷菜单双击某一视图&#xff0…

webSocket介绍及项目实战【在线聊天系统】

文章目录 一&#xff1a;消息推送常用方式介绍1.1 轮询&#xff1a;浏览器以指定的时间间隔向服务器发出HTTP请求&#xff0c;服务器实时返回数据给浏览器1.2 长轮询&#xff1a;浏览器发出ajax请求&#xff0c;服务器端接收到请求后&#xff0c;会阻塞请求直到有数据或者超时才…

学习之-Spring Cache缓存框架应用本地缓存

此文章用于个人学习记录&#xff0c;原文地址&#xff1a;https://zhuanlan.zhihu.com/p/452315531 如果想了解springCache与redis的交互请看其他文章 缓存是web项目不可或缺的一部分&#xff0c;通过缓存能够降低服务器数据库压力&#xff0c;提高服务器的稳定性及响应速度。…

Rust + 嵌入式:强力开发组合

Rust 的由来 Rust 编程语言的灵感诞生于一次意外。2006年&#xff0c;当 Graydon Hoare 回到位于温哥华的公寓时&#xff0c;发现电梯又因为软件崩溃出了故障。住在 21 楼的他无奈爬楼时&#xff0c;不禁心想&#xff0c;“我们搞计算机的&#xff0c;怎么连个能正常运行的电梯…

接口测试要会什么技能?测试老鸟总结,从接口到接口自动化全面盲扫...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

YOLOv5改进:引入DenseNet思想打造密集连接模块,彻底提升目标检测性能

目录 一、密集连接模块的介绍1、密集连接的概念2、密集连接与残差连接的对比3、DenseNet的结构 二、 YOLOv5中引入密集连接模块的原因1、密集连接模块对于目标检测的优势2、密集连接模块对目标检测性能的影响 三、 YOLOv5中密集连接模块的具体实现1、使用DenseNet的基本单元Den…

怎样才能尽快从开发岗转到产品经理岗位?

越来越多的开发同学随着工作年限的增长都会产生类似的想法。 当然&#xff0c;背后的原因也是多种多样&#xff0c;像薪资上的限制、行业前景的担忧等等&#xff0c;很多同学则踌躇在原地不敢转产品岗位&#xff0c;而有的同学则是通过各种不同方式顺利转岗到产品经理岗位&…

树莓派从源码构建安装Git最新版

1、查看Git版本 首先我们通过SSH客户端连接树莓派,在树莓派中通过查看 Git 版本信息&#xff0c;我们只能看到最高版本显示为 2.30.2&#xff0c;并且通过apt安装也无法将Git更新到最新版。 git --version sudo apt upgrade git那么我们只能通过从源代码来构建安装Git了&…

单片机复习题第二章

1.在AT89S52单片机中&#xff0c;如果采用6MHz晶振&#xff0c;一个机器周期为2us。 时钟周期的振荡频率为fosc&#xff0c;则时钟周期T1/fosc。 一个机器周期包括12个时钟周期。 2.内部RAM中&#xff0c;位地址为40H&#xff0c;88H的位&#xff0c;该位所在字节的字节地址分别…

scrollIntoView 的使用

描述 将调用此方法的元素滚动到浏览器窗口的可见区域。 scrollIntoView 官方文档 用法 element.scrollIntoView() 用法同 element.scrollIntoView(true) element.scrollIntoView(alignToTop) true 表示 element 元素顶部与可见区域的顶部对齐&#xff0c;默认值false 表示 el…

基于html+css的图展示56

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Packet Tracer - 第 2 层 VLAN 安全

Packet Tracer - 第 2 层 VLAN 安全 目标 在 SW-1 和 SW-2 之间连接新的冗余链路。 启用中继&#xff0c;并在 SW-1 和 SW-2 之间的新中继链路上 配置安全。 创建新的管理 VLAN (VLAN 20) 并将管理 PC 连接到 该 VLAN。 实施 ACL 以阻…

Java学习-GUI编程-JFrame窗口

Java学习-GUI编程-JFrame窗口 public class TestJFrame {public void init(){JFrame jf new JFrame("这是一个JFream窗口");jf.setVisible(true);jf.setBounds(100,100,400,400);JLabel label new JLabel("这是一个label");label.setHorizontalAlignmen…

Linux之shell函数和正则表达式(八)

1、函数 1、函数概述 shell 中允许将一组命令集合成语句形成一段可用代码&#xff0c;这些代码块称为 shell 函数&#xff0c;给这段代码起个名字称为函数名&#xff0c;后续可以直接调用该段代码的功能 2、定义函数 函数名() {函数体&#xff08;一堆命令的集合&#xff0…

程序员的下一个风口

面对近一年的裁员潮&#xff0c;以及 GPT 出现带来的 AI 颠覆潮流&#xff0c;各种话题出现&#xff1a;「前端已死」、「后端已死」、「Copy/Paste 程序员将被 AI 取代」。程序员行业是否还有发展空间&#xff1f; 这一两年的就业机会是因为经济衰落周期内造成的&#xff0c;不…

pmp备考有哪些适合新手的学习资料?

在备考中&#xff0c;无论你是胸有成竹的学霸还是忐忑不安的学渣&#xff0c;强烈建议你是时候展现真正的技术了——临阵磨枪不快也光&#xff01;你准备好了吗&#xff1f;前方为大家准备了高能备考技巧和干货资料包&#xff0c;拿起热水杯&#xff0c;准备走起。 1.PMBOK知识…

怎样使用Web自动化测试减少手动劳动?以百度网站为例

从入门到精通&#xff01;企业级接口自动化测试实战&#xff0c;详细教学&#xff01;&#xff08;自学必备视频&#xff09; 目录 摘要 步骤1&#xff1a;安装和配置Selenium 步骤2&#xff1a;启动浏览器并访问百度网站 步骤3&#xff1a;关闭浏览器 总结 摘要 本指南将…

数据风险评估

通过数据风险评估定位敏感数据并分析其漏洞。根据文件的敏感度对文件进行分类&#xff0c;并确保为它们提供必要的保护。 发现、分析和保护敏感数据 查找所有个人数据根据敏感度对文件进行分类遵守 IT 法规分析文件和权限 查找所有个人数据 监控企业存储环境并接收有关敏感…

(CVE-2022-22965)Spring Framework 远程命令执行漏洞(vulfocus复现)

漏洞原理 该漏洞是SpringFramework数据绑定的一个漏洞&#xff0c;如果后台方法中接受的参数为非基础类型&#xff0c;Spring会根据前端传入的请求正文中的参数的key值来查询与其名称所对应的getter和setter方法&#xff0c;攻击者利用这一特性修改了Tomcat的一个用于日志记录…

java开发记录v2(引入jar,问题及解决)

引入本地jar包 在src同级目录下新建libs目录将jar包放入进去 在pom.xml中下加入以下代码 <dependencies><dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId><version>1.1.8</ver…