zoukankan      html  css  js  c++  java
  • 防止 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);
    
  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/ringbug/p/15074674.html
Copyright © 2011-2022 走看看