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);
    
  • 相关阅读:
    一生不可错过的五句话
    分布式缓存系统Memcached简介与实践[转]
    telnet serverip serverport 可以测试服务器端口是否通
    使用c#生成高品质小空间的缩略图
    sql server2005对tsql的增强之在聚合函数的后面使用over关键字
    (转)让你受益终身的10个Word实用技巧
    sql取所有记录中每天的最后一笔交易的记录
    屏蔽服务器端包含在文件不存在时报错的错误信息
    c#农历日历类
    Niubility 英语教程
  • 原文地址:https://www.cnblogs.com/ringbug/p/15074674.html
Copyright © 2011-2022 走看看