• Objects.requireNonNull的意义是什么


    Objects.requireNonNull方法的源码是这样:

    public static  T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }
    

    曾经我很疑惑,这个判断对象为null再抛出空指针异常的作用是什么,参数为null自然会发生空指针异常,为什么要手动抛出呢?

    它的意义有2点:

    1. 明确代码意图
    2. Fail-fast 快速失败

    明确代码意图

    Objects.requireNonNull让方法的调用者明确某个参数不能为 null。比如,写方法的单元测试,不需要考虑方法参数为null的场景,因为这个场景的是受控的,是不允许的。

    Fail-fast

    (1) Fail-fast 的意思是让代码尽可能早的发生失败,而不是在中途失败。

    Fail-fast 的好处,首先是能立即且稳定的检测出代码的问题,代码立即报错,避免了无用的代码操作;也避免了业务处于一个中间状态,比如业务做到一半出现异常,有可能会出现脏数据。因此,Fail-fast 也提升了程序的稳定性。 在平时写业务代码时,校验逻辑尽可能放在方法前,避免业务在校验不通过前,做了无用操作。比如:

    public String getUserName(User user, String countryCode) {
        queryCountry(countryCode);
        return getUserLastName(user);
    }
    
    public String getUserLastName(User user) {
        return user.getName().getLastName();
    }
    

    user为 null时, queryCountry就是无用操作。

    (2) Fail-fast能快速定位错误位置,也方便Dubug。

    如果user参数为 null,你能定位到哪一行报错,但还不能确保是user还是user.getName的问题,所以你要去调试。如果变量的引用层级更深,定位问题源就更麻烦。如果在源头处控制了user的行为,那么后续操作就令人放心。如果我们在getUserName方法的第一行加上Objects.requireNonNull,这样在报错时我们能准确的捕捉到报错原因,并及时终止业务操作。

    public String getUserName(User user, String countryCode) {
        Objects.requireNonNull(user, "user cannot be null");
        queryCountry(countryCode);
        return getUserLastName(user);
    }
    
    public String getUserLastName(User user) {
        return user.getName().getLastName();
    }
    

    类似用法

    其实在 JDK 中主动对参数判空,然后抛出空指针异常的写法随处可见,它的目的就是提醒方法的调用者,我这个参数不能为空,如果你传入的参数为空了,我能及时终止程序运行,且每次都是相同且稳定的返回结果。
    最后,lombok的@NonNull注解也有这样的功能。比如:

    public int getLength(@NonNull String str) {
        return str.length();
    }
    

    编译后的字节码文件为:

    public int getLength(@NonNull String str) {
        if (str == null) {
            throw new NullPointerException("str is marked non-null but is null");
        } else {
            return str.length();
        }
    }
    
  • 相关阅读:
    7.0 异常处理
    华为机试 - 水仙花数Ⅱ
    ElasticSearch入门
    【提高效率】C++使用map替代传统switch case
    OpenAI科学家谈GPT-4的潜力与挑战
    企业级BOM系统与外部系统集成的几种方案
    实战:自定义简单版redux, enhancer与react-redux
    【C++】STL简介 | string类的常用接口
    vscode中git拉取、提交代码、解决冲突,以及合并代码的操作
    手工挖XSS漏洞
  • 原文地址:https://www.cnblogs.com/cloudrich/p/16923818.html