首页 > 其他分享 >这段代码会抛出NPE,你造吗?----封装AssertUtil来友好地利用断言

这段代码会抛出NPE,你造吗?----封装AssertUtil来友好地利用断言

时间:2023-05-26 16:34:02浏览次数:42  
标签:Assert 你造 null NPE IllegalArgumentException ---- AssertUtil userSignQuery public

运行下面代码,会抛出NPE。你知道为什么吗?

import cn.hutool.core.lang.Assert;

public class TestMain {

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        Assert.isTrue(myClass.myProperty == 0);
    }


    private static class MyClass {
        private Integer myProperty;

    }
}

原因:初始化myClass对象后,Integer类型的myProperty属性的值是默认值null。此时,执行myClass.myProperty == 0,其实是调用了 Integer#intValue()方法进行拆箱操作,由于Integer对象是null,致使NPE。

上面代码在IDE里不会提示任何问题。而下面代码,IDE则会给出NPE提示。

 

 

我今天在写一个对外暴露的接口方法,利用断言判断入参合法性时,恰好想到了这个问题点。就像上面的示例代码,还没到执行断言呢,就抛出了NPE了。显然,要先断言属性不为null。

如下是我改完后的程序代码

    public Result<UserSignDTO> userHasSign(UserSignQuery userSignQuery) {
        try {
            Assert.notNull(userSignQuery);
            Assert.notNull(userSignQuery.getIdcardNo());
            Assert.notNull(userSignQuery.getEnterpriseId());
            Assert.notNull(userSignQuery.getProviderId());
            Assert.isTrue(userSignQuery.getEnterpriseId()>0);
            Assert.isTrue(userSignQuery.getProviderId()>0);
            
            ...
            
        } catch (IllegalArgumentException e) {
            return Result.err(e.getMessage());
        }
    }

 

毋庸置疑,用断言可以增加代码的优雅度。而这一坨Assert,却跟优雅沾不上边。

 

于是乎,发挥点匠心精神吧。下面AssertUtil问世,基于Assert进行工具的封装。

package com.emax.common.util;

import cn.hutool.core.lang.Assert;

public class AssertUtil {
    /**
     * 断言所有对象是否不为{@code null} ,如果为{@code null} 抛出{@link IllegalArgumentException} 异常
     *
     * @param errMsg 断言失败的错误消息
     * @param objects
     */
    @SafeVarargs
    public static <T> void allNotNull(String errMsg, T... objects) throws IllegalArgumentException {
        for (T object : objects) {
            T t = errMsg == null ? Assert.notNull(object) : Assert.notNull(object, errMsg);
        }
    }

    /**
     * 断言所有对象是否不为{@code null} ,如果为{@code null} 抛出{@link IllegalArgumentException} 异常
     *
     * @param objects
     */
    public static <T> void allNotNull(T... objects) throws IllegalArgumentException {
        allNotNull(null, objects);
    }

    /**
     * 判断对象是数字,并且大于0
     *
     * @param number
     * @throws IllegalArgumentException
     */
    public static void gt0(Number number) throws IllegalArgumentException {
        Assert.notNull(number);
        Assert.isTrue(number.longValue() > 0);
    }
    
    ....其他断言方法
    
}

 

OK,改为使用AssertUtil断言,如下,是不是优雅?你品。

    public Result<UserSignDTO> userHasSign(UserSignQuery userSignQuery) {
        try {
            AssertUtil.allNotNull(userSignQuery, userSignQuery.getIdCardNo());
            AssertUtil.gt0(userSignQuery.getEnterpriseId());
            AssertUtil.gt0(userSignQuery.getProviderId());
            if (userSignQuery.getUserId() == 0 || StringUtils.isBlank(userSignQuery.getIdcardNo())) {
                throw new IllegalArgumentException("userId或身份证号码必传一项");
            }
            
            ...
            
        } catch (IllegalArgumentException e) {
            return Result.err(e.getMessage());
        }
    }

 

标签:Assert,你造,null,NPE,IllegalArgumentException,----,AssertUtil,userSignQuery,public
From: https://www.cnblogs.com/buguge/p/17435099.html

相关文章

  • 前端vue中实现文件下载的几种方法 四种方法, a.download = "重新下命名下载文件名"
    前端vue中实现文件下载的几种方法原文链接:https://blog.csdn.net/weixin_46074961/article/details/105677732第一种前端创建超链接,通过a标签向后端发送get请求,需要给a标签添加一个download属性这种写法是创造了一个a标签,把地址写到a标签里再用js调用点击,实现访问文件地址......
  • hdu:序列划分(构造二分)
    ProblemDescription给定\(n\)个正整数\(a_1,a_2,\dots,a_n\),将这个序列从左到右划分成\(m\)段,使得每段至少有一个数。你需要让数字之和最大的那一段的数字和尽可能得小。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,m(1≤m≤......
  • 虚拟机安装k8s
    k8s集群参考配置环境#关闭selinux(管安全的)sed-i's/enforcing/disabled/'/etc/selinux/config#关闭swap(类似虚拟内存,会有性能和管理问题)swapoff-ased-ri's/.*swap.*/#&/'/etc/fstab#添加hostcat>>/etc/hosts<<EOF192.168.114.134key0119......
  • centos7升级内核到5.4
    centos7升级内核到5.4一、yum的方式升级1、查看当前内核版本#uname-srLinux3.10.0-1160.el7.x86_642、安装elrepo载入公钥,安装eprepo源(网址:http://elrepo.org/)#rpm--importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org#rpm-Uvhhttps://www.elrepo.org/elrepo-......
  • Struts2实例
    <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@taglibprefix="s"uri="/struts-tags"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitio......
  • EasyDSS如何调用接口获取录像MP4文件合成状态?
    EasyDSS互联网视频云服务的视频直播/点播功能支持视频采集、编辑、上传、媒体资源管理、自动化转码处理、分发服务等,帮助用户快速搭建拥有极致观看体验、安全可靠的视频直播点播应用。有用户反馈在调用接口时,会出现合成中的字样,并不知道合成的录像MP4文件是否已经合成完毕。今天我......
  • M洞察|“MOBA”还是“MMO”?2023上半年热门手游大盘点来了,拯救你的游戏荒
    2023年Q1中国移动游戏市场整体表现不及预期,实际销售收入为486.94亿元,同比下降19.42%。虽整体有所下滑,但新鲜血液依然迸发强劲。3月22日,一款玩法轻松、新颖的种田类手游《桃源深处有人家》正式上线,玩家纷纷投入其中,化身萝萝山的村民,共同建设美丽新农村。而4月26日备受关注的米哈游新......
  • springboot2.7使用log4j2的maven配置
    先排查自带的<!--排除自带的--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions>......
  • BGP线路有什么优势?
    BGP线路有什么优势? 1、消除南北访问障碍由于BGP可以将联通、电信、移动等运营商的线路“合并”,使得中国南北无障碍通讯成为可能,对接入层来说,可使“联通、电信”这类区别消失,更能使一个网站资源无限制的在全国范围内无障碍访问,而不需要在异地部署VPN或者异地加速站来实现异地无......
  • ADManager Plus:微软的全面活动目录管理解决方案
    摘要:ADManagerPlus是微软推出的一款全面活动目录(ActiveDirectory)管理解决方案。它提供了一系列强大的功能,帮助组织简化和自动化活动目录管理,提高安全性和效率。本文将介绍ADManagerPlus的特点、优势以及在企业中的应用价值。微软的ADManagerPlus是一款功能强大的全面活动目录管......