写点什么

牛逼,这 2 招,彻底让你和 null say 拜拜

  • 2021 年 11 月 12 日
  • 本文字数:1484 字

    阅读完需:约 5 分钟

Exception in


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


thread "main" java.lang.NullPointerException


at com.cmower.dzone.stopdoing3things.NullDemo.main(NullDemo.java:12)


那假如小二在遍历的时候不想判空又不想代码抛出 NPE 错误,他该怎么做呢?闭上你的大眼睛好好想一想。



嗯,报告,我想出来了,建议小二从数据库中获取姓名的时候返回长度为 0 的列表,来表示未找到数据的情况。代码示例如下所示:


public class Null2Length0Demo {


public static void main(String[] args) {


List<String> names = getNamesFromDB();


for (String name : names) {


System.out.println(name);


}


}


public static List<String> getNamesFromDB() {


// 模拟此时没有从数据库获取到对应的姓名。


return Collections.emptyList();


}


}


注:Collections.emptyList() 用于返回一个不可变的空列表,能理解吧?假如不能理解的话,我再写一个返回可变的空列表的示例,你对比着感受一下就理解了。


public class Null2Length0MutableDemo {


public static void main(String[] args) {


List<String> names = getNamesFromDB();


for (String name : names) {


System.out.println(name);


}


}


public static List<String> getNamesFromDB() {


// 模拟此时没有从数据库获取到对应的姓名。


return new ArrayList<>();


}


}


new ArrayList<>() 返回的就是可变的,意味着你还可以改变这个列表的元素,比如说增加,删除是不可能的了,因为本身就没有元素可删。


你看,Collections.emptyList()new ArrayList<>() 都可以替代 null,来减少打印列表时不必要的判空以及那个讨厌的家伙——NPE。


除了我这个想法之外,你还能想到其他的解决方案吗?来,再次闭上你的大眼睛,替小二想一想,没准你还能想到一个—— Java 8 新增的 Optional 类,一个容器类,可以存放任意类型的元素,如果值存在则


isPresent() 方法会返回 true;Optional 类提供了很多专业的方法而不用显式进行空值检查,从而巧妙地消除了 NPE。


来,先读示例为快!


public class Null2OptionalDemo {


public static void main(String[] args) {


Optional<List<String>> list = getNamesFromDB();


list.ifPresent(names -> {


for (String name : names) {


System.out.println(name);


}


});


}


public static Optional<List<String>> getNamesFromDB() {


boolean hasName = true;


if (hasName) {


String [] names = {"沉默王二", "一枚有趣的程序员", "微信搜索关注我"};


return Optional.of(Arrays.asList(names));


}


return Optional.empty();


}


}


看得不太懂?我来负责任地介绍一下,你们握个手。


假如数据库中存在姓名,则使用 Optional.of() 对返回值进行包装,从而返回一个 Optional 类型的对象。为什么不用构造方法呢,因为构造方法是 private 的(源码如下所示)。


private Optional(T value) {


this.value = value;


}


那为什么要用 Optional.of() 呢?嗯,good question。继续上源码。


public static <T> Optional<T> of(T value) {


return new Optional<>(Objects.requireNonNull(value));


}


1)如果 value 为 null,那么 Objects.requireNonNull(value) 就会抛出 NPE(嗯哼,总归是要碰面的,但好歹不用我们程序员主动 check 了)。


2)如果 value 不为 null,则通过 new 关键字创建正常的 Optional 对象。


假如数据库中不存在姓名呢?使用 Optional.empty() 作为返回值。来,继续上源码。


public static<T> Optional<T> empty() {


@SuppressWarnings("unchecked")


Optional<T> t = (Optional<T>) EMPTY;


return t;


}


嗯哼,EMPTY 是什么玩意?

评论

发布
暂无评论
牛逼,这2招,彻底让你和 null say 拜拜