Offer 驾到,掘友接招!我正在参与2022春招系列活动-Debug实录任务,点击查看活动详情。
一、问题描述:
java.lang.NullPointerException 是我们常见的开发问题之一,下面来看看大家进场容易犯的几种错误。
- 访问空对象的属性
- 空属性进行
equals
、hashcode
或者其他对象方法调用
- 将 null 传递给基础类型的方法入参数
调用方法
public static void test(int userId) {
System.out.println(userId);
}
二、解决方法:
通用的解决方式有 3 种,分别是增加 if 判断,Optional 判断,或者增加编译 @NonNull 注解。
-
增加 if 判断,判断逻辑是 对象 != null && 对象.属性 != null 具体代码如下:
UserDto userDto = new UserDto(); if (userDto != null && Objects.equals(userDto.getUserId(), 1)) { test(userDto.getUserId()); }
这个办法看上去比较复杂,其实非常严谨、简单。如果项目中非常多类似的判断可以做通用的方法风封装比如
IntegerUtil
、StringUtil
。还可以做一些定制化的逻辑,防止后期批量修改,减少代码改动。其实我们开发中也用到的三方的工具包如:hutool-util
、apache-common
等 -
通过 Optional 判断, 如果不为空才执行调用方法,或者返回默认值 具体代码如下:
// 不为空才执行 UserDto userDto = new UserDto(); Optional.of(userDto.getUserId()).ifPresent(item -> { test(userDto.getUserId()); }); // 如果为空返回默认值 Integer userId = Optional.of(userDto.getUserId()).orElse(1);
Java 8 引入 Optional 类, 主要解决的问题是臭名昭著的空指针异常 (NullPointerException)。 这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空,提供了非常多的实用方法比如:
ifPresent
、orElse
。 Optional 是 Java 实现函数式编程的基石, 也是 Java 8 带来的一个非常优秀语法糖。 -
增加编译 @NonNull 注解 (
org.springframework.lang.NonNull
) 代码如下:public static void test(@NonNull Integer userId) { System.out.println(userId); }
我一般提供公共方法,或者一些调用方法的时候,都会通过
NonNull
、Nullable
去标记这个参数是否可以为空,这样可以方便的在我第调用的时候一目了然是否可以为空,而且如果传递参数为空,idea 会在编译的时候有提示的,非常方便。 还有就是对于web api
接口的参数我们可以通过 jsr303 的一些注解去标注,是否为空,然后通过 @Vaild 去执行也是非常方便的。比如:Spring MVC
、Hibernate Validator
都提供了丰富的参数检验库。特殊的我们也可以自己去定义。
三、总结:
本文比较简单和直观的描述了常见的几种
java.lang.NullPointerException
场景和解决方案。如果大家有也有类似的经历可以留言探讨
对于 NullPointerException
异常往往是在运行时的,可能我们去 select
一条数据,但是这个字段是非必填的,但是我们在查询的时候没有做 mapping
映射到 entity
也会出现 NullPointerException
。 所以大家对于代码逻辑的检查,很多时候都需要做一个折中的选择,其实在项目中只要能够找到这个平衡就好。
今天的文章java.lang.NullPointerException 常见问题|Java Debug笔记分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14730.html