防止 NPE,是程序员的基本修养,注意 NPE 产生的场景

[阿里规约]

  • 1)返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
    反例:public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。
  • 2) 数据库的查询结果可能为 null。
  • 3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
  • 4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
  • 5) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
  • 6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。
    正例:使用 JDK8 的 Optional 类来防止 NPE 问题。

JDK8 的 Optional 类的使用

1.概念

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

2.类声明

以下是一个 java.util.Optional 类的声明:

public final class Optional<T>
extends Object

3.使用方式

 User user = new User("1", "admin", "123456");

//        1	static <T> Optional<T> empty()
//        返回空的 Optional 实例。
        Optional<Object> empty = Optional.empty();
        System.out.println(empty);

//        2	boolean equals(Object obj)
//        判断其他对象是否等于 Optional。
        Optional<User> opt1 = Optional.ofNullable(user);
        boolean flag = opt1.equals(user);
        System.out.println(flag);

//        3	Optional<T> filter(Predicate<? super <T> predicate)
//        如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
        Optional<User> user2 = Optional.ofNullable(user).filter(user1 -> "admin".equals(user1.getUserName()));
        System.out.println(user2.toString());
//        4	<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
//        如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
        Optional<String> user4 = Optional.ofNullable(user).flatMap(user1 -> Optional.ofNullable(user.getUserName()));
        System.out.println(user4);
//        5	T get()
//        如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
        User user5 = Optional.ofNullable(user).get();
        System.out.println(user5);
//        User user6 = (User) Optional.empty().get();//NoSuchElementException: No value present
//        System.out.println(user6);
//        6	int hashCode()
//        返回存在值的哈希码,如果值不存在 返回 0。
        int i = Optional.empty().hashCode();
        System.out.println(i);
        int j = Optional.ofNullable(user).hashCode();
        System.out.println(j);
//        7	void ifPresent(Consumer<? super T> consumer)
//        如果值存在则使用该值调用 consumer , 否则不做任何事情。
        Optional.ofNullable(user).ifPresent(u -> System.out.println(u.getUserName()));
        Optional.empty().ifPresent(System.out::println);
//        8	boolean isPresent()
//        如果值存在则方法会返回true,否则返回 false。
        boolean flag1 = Optional.of("zhangyingzi").isPresent();
        System.out.println(flag1);
//        9	<U>Optional<U> map(Function<? super T,? extends U> mapper)
//        如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
        Optional<String> user3 = Optional.ofNullable(user).map(user1 -> user1.getUserName());
        System.out.println(user3.get());
//        10	static <T> Optional<T> of(T value)
//        返回一个指定非null值的Optional,否则报空指针异常
        Optional<String> lailai = Optional.of("lailai");
        System.out.println(lailai);
//        11	static <T> Optional<T> ofNullable(T value)
//        如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
        Optional<User> user7 = Optional.ofNullable(user);
        System.out.println(user7);
//        12	T orElse(T other)
//        如果存在该值,返回值, 否则返回 other。
        String s = Optional.ofNullable("xiaoma").filter(a -> a.length() > 6).orElse("this is code length less than 6");
        System.out.println(s);
//        13	T orElseGet(Supplier<? extends T> other)
//        如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
        String s1 = Optional.ofNullable("zhangyingzi").orElseGet(() -> "aaa");
        System.out.println(s1);
        Object s2 = Optional.empty().orElseGet(() -> "aaa");
        System.out.println(s2);
//        14	<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
//        如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
        String s3 = Optional.of("zhangyingzi").orElseThrow(() -> new NullPointerException("Opthonal为空"));
        System.out.println(s3);
//        Object haha = Optional.of(null).orElseThrow(() -> new NullPointerException("Opthonal为空"));//java.lang.NullPointerException
//        System.out.println(haha);
//        15	String toString()
//        返回一个Optional的非空字符串,用来调试
        Optional<String> zhangyingzi1 = Optional.of("zhangyingzi");
        String s4 = zhangyingzi1.toString();
        System.out.println(s4);
原文地址:https://www.cnblogs.com/ringbug/p/15074674.html