Objects.requireNonNull方法的源码是这样:

public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}

曾几何时,我的想法是,这个判断对象为 null,再抛出NPE没啥用啊,参数为null自然就会抛空指针异常,还用得着手动抛出吗?

其实是有意义的,总结就是:

  1. 明确代码意图
  2. 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();
}
}

使用哪种方式看团队规范。

最新文章

  1. 【转载】.NET模拟POST登录并保持登录状态
  2. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
  3. 【JAVA、C++】LeetCode 007 Reverse Integer
  4. chm文件打开,有目录没有内容
  5. xcode duplicate symbol _GAD_MD5 解决方法
  6. python_基础学习_01_按行读取文件的最优方法
  7. 探讨.NET Core数据加密和解密问题
  8. net core 使用tagHelper将 enum枚举类型转换为下拉列表select
  9. 关于L298N的应用
  10. Apache的commons工具类
  11. 洛谷 P3237 [HNOI2014]米特运输
  12. SDL_BlitSurface
  13. ubuntu下安装nodejs和npm
  14. bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT
  15. spi驱动框架全面分析,从master驱动到设备驱动
  16. PHP 数字金额转换成中文大写金额的函数 数字转中文
  17. visual studio 2017无建模项目?
  18. 数据排序 第三讲( 各种排序方法 结合noi题库1.10)
  19. 异常[PersistenceUnit: default] Unable to build Hibernate SessionFactory
  20. rabbit 函数参数详解

热门文章

  1. Windows服务器的重复数据删除功能
  2. Echarts中tooltip解决显示指定数据
  3. 第六章:Django 综合篇 - 18:国际化和本地化
  4. 腾讯云主机安全【等保三级】CentOS7安全基线检查策略
  5. rocketmq 4.x 双主双从同步读写
  6. Docker网络详解——原理篇
  7. C#高级特性(反射)
  8. 【设计模式】Java设计模式 - 命令模式
  9. 2022美团Java后端开发春招实习面经
  10. day10-习题