Objects.requireNonNull的意义是什么
Objects.requireNonNull方法的源码是这样:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
曾几何时,我的想法是,这个判断对象为 null,再抛出NPE没啥用啊,参数为null自然就会抛空指针异常,还用得着手动抛出吗?
其实是有意义的,总结就是:
- 明确代码意图
- Fail-fast 快速失败
Objects.requireNonNull让方法的调用者明确某个参数不能为 null。比如,写方法的单元测试,不需要考虑方法参数为null的场景,因为这个场景的是受控的,是不允许的。
Fail-fast的意思是让代码尽可能早的发生失败,而不是在中途失败。Fail-fast的好处,首先是能立即且稳定的检测出代码的问题,代码立即报错,避免了无用的代码操作。在平时写业务代码时,校验逻辑尽可能放在方法前,避免业务在校验不通过前,做了无用操作。比如:
public String getUserName(User user, String countryCode) {
queryCountry(countryCode);
return getUserLastName(user);
}
public String getUserLastName(User user) {
return user.getName().getLastName();
}
user为 null时, queryCountry就是无用操作。
Fail-fast能快速定位错误位置,也方便Dubug。如果user参数为 null,你能定位到哪一行报错,但还不能确保是user还是user.getName()的问题,所以你要去调试。如果变量的引用层级更深,定位问题源就更麻烦。如果在源头处控制了user的行为,那么后续操作就令人放心。从另一方面讲,也提升了程序的稳定性。
最后, lombok的@NonNull注解也有这样的功能。比如:
public int getLength(@NonNull String str) {
return str.length();
}
编译后的效果是:
public int getLength(@NonNull String str) {
if (str == null) {
throw new NullPointerException("str is marked non-null but is null");
} else {
return str.length();
}
}
使用哪种方式看团队规范。
Objects.requireNonNull的意义是什么的更多相关文章
- learning java Objects.requireNonNull 当传入参数为null时,该方法返回参数本身
System.out.println(Objects.hashCode(obj)); System.out.println(Objects.toString(obj)); System.out.pri ...
- 如何优雅的使用Objects.requireNonNull(T obj, String message)定制你的NPE异常
IDEA中习惯跟踪源码实现逻辑,多次碰到Objects.requireNonNull(T obj)这个方法,改方法主要用于提早判断对象是否为空,以便更早的抛出NPE 平时小组开发中强调程序健壮性,不允 ...
- 【Java】Objects 源码学习
2017-02-10 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/6387321.html 本篇概要 Objects 与 Object ...
- 【jdk源码2】Objects源码学习
在学习上一个类TreeMap的时候,提到了这个类,这个类是jdk1.7新增的,里面有很多实用的方法.就是一个工具类,熟悉以后,如果里面有已经实现的方法,那么就不要再去实现了,省时省力省测试. 一.简单 ...
- 【Java】java.util.Objects 源码学习
2017-02-10 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/6387321.html 本篇概要 Objects 与 Object ...
- java之Objects类
Objects类概述 在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空 ...
- java 常用类库:Object类和Objects类
1,Object类: Object类是所有的类,数组,枚举的父类,也就是说,JAVA中允许把任何的对象赋值给Object类(包括基础数据类型),当定义一个类的时候,没有使用extends关键字显示指定 ...
- throw关键字和Objects非空判断_requireNonNull方法
作用: 可以使用throw关键字在指定的方法中抛出指定的异常 使用格式: throw new xxxException("异常产生的原因") 注意: 1.throw关键字必须写在方 ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- 【JUC】JDK1.8源码分析之CopyOnWriteArrayList(六)
一.前言 由于Deque与Queue有很大的相似性,Deque为双端队列,队列头部和尾部都可以进行入队列和出队列的操作,所以不再介绍Deque,感兴趣的读者可以自行阅读源码,相信偶了Queue源码的分 ...
随机推荐
- 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿
1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发.测试和管理项目上的任务.Fiddler已有的功能已经 ...
- Python 第三次实验
一如既往地简单,不到半个小时即可完成 [1] (程序设计)输入一个正整数,输出它的因子分解式.如输入132,则输出132=122311 n=int(input()) print(1,end='') f ...
- Kubernetes后台数据库etcd:安装部署etcd集群,数据备份与恢复
目录 一.系统环境 二.前言 三.etcd数据库 3.1 概述 四.安装部署etcd单节点 4.1 环境介绍 4.2 配置节点的基本环境 4.3 安装部署etcd单节点 4.4 使用客户端访问etcd ...
- 《Java基础——线程类》
Java基础--线程类 一.线程的创建之Thread类: 规则: 通过声明一个新类作为子类继承 Thread 类,并复写 run() 方法,就可以启动新线程并执行自己定义的 run()方法 ...
- KVM常用命令及配置文件
1.查看虚拟机配置文件 [root@KVM tmp]# ls /etc/libvirt/qemu/ damowang.xml networks [root@KVM tmp]# ls /etc/libv ...
- 使用KubeOperator安装k8s集群后,节点主机yaml文件路径
[root@k8s-develop-master-1 kubernetes]# cd /etc/kubernetes [root@k8s-develop-master-1 kubernetes]# l ...
- 修改 Docker容器 自动启动/不自动启动,挂载路径,存储位置
有时候创建容器时忘了添加参数 --restart=always,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker conta ...
- Portainer 安装MySQL并开启远程访问
进入到 Portainer 页面,选择左边的 Containers 选项,单击上方的 Add container 按钮转到如图所示的页面: 1.在 Name 一栏中输入容器名字: 2.在 Image ...
- 使用growpart扩容CentOS虚拟机磁盘
说明 一块磁盘,比如有130G,但是只有100G拿来用了,安装俩分区,一个是swap,另一个是根分区/,根分区采用的是LVM逻辑卷管理. 现在要做的是把剩余的这空闲30G分配给根分区使用 这个并不是新 ...
- 16. 综合使用tail、forward、copy和stdout
通过一个例子进行阶段总结. 本示例使用到如下插件:in_tail, out_copy, out_stdout, out_forward, in_forward. 本示例包含两个节点: node_for ...