[阿里规约]
- 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);