烦人的Null,你可以走开点了 (3)

运行后,代码没有任何输出,也没有出现 NPE 异常。没有输出的原因是我们传入了一个 null 值,这个 null 表示值不存在。此时,我们调用 Optional 的 ifPresent 方法做了判断,只有存在值时,才会执行打印输出。

接下来,我们把 null 替换成有意义的值看看。

import java.util.Optional; class Player{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Optional4NPE { public static void main(String[] args) { Player player = new Player(); player.setId(1); player.setName("demoUser"); Optional<Player> optionalPlayer = Optional.ofNullable(player); optionalPlayer.ifPresent(u -> System.out.println(u.getName())); } }

输出结果:

demoUser Process finished with exit code

可以看到,当传入一个我们创建的 player 时,执行了打印输出方法。

上面我们已经发现,通过 Optional 的 ifPresent 方法,我们明确了 null 的含义,明确认定只要值为 null,就表示不存在。那如果一个变量存在,但是没有值或者没有有意义的值呢?

我们把代码改改:

import java.util.Optional; class Player{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Optional4NPE { public static void main(String[] args) { Player player = null; Player defaultPlayer = new Player(); defaultPlayer.setId(1); defaultPlayer.setName("————undefinedNAME-----"); Player player1 = Optional.ofNullable(player).orElse(defaultPlayer); System.out.println(player1.getName()); } }

运行结果如下:

————undefinedNAME----- Process finished with exit code 0

这里可以看到,我们使用 orElse 方法,当一个变量值为 null 时,返回一个默认值。通过返回默认值,我们明确了 null 的另外一个含义,对象存在,但是可能没有实际意义。

Optional 的出现,大大改善了我们的 Java 代码质量,减少了 NPE 的可能性,并使得代码的可读性大大增强。

通过使用 Optional,开发人员还能非常自然轻松的使用 Null Object Pattern 模式去处理 Null 问题。Optional 是非常值得在项目中大范围使用的。

烦人的Null,你可以走开点了

5. 总结

最后总结一下。

我们在项目中综合利用 @NonNull 注解,findbugs 静态代码检查,还有引入 Optional 等方式,大大减少了 NPE 出现的场合。

不过,有一说一,这些方法也会加大项目开发复杂度,增大了编译测试时间。

同时,使用好 findbugs 也是有一些门槛的,其本身检测代码有时候严格程度也很难把握。Optional本身也提供了 of 方法,这个方法不小心也会引入新的 NPE 问题。

但是,我认为这些相对于 NPE 可能对线上系统造成的损失而言,都是值得的。我们现在可以说:
NPE,你可以走开点了。

我准备了一些纯手打的高质量PDF,有好友赞助的也有我自己的,大家可以免费领取:
深入浅出Java多线程、HTTP超全汇总、Java基础核心总结、程序员必知的硬核知识大全、简历面试谈薪的超全干货。

别看数量不多,但篇篇都是干货,看完的都说很肝。

领取方式:扫码关注后,在公众号后台回复:666

烦人的Null,你可以走开点了

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszff.html