【lombok】@NonNull - 我是如何不再忧虑NPE并爱上她的

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/amoscn/article/details/86543392

@NonNull

说到NullPointerException,可能会是所有java搬砖工的噩梦吧?

现在有了@NonNull , 让我们不在忧虑NPE!!!

您可以在方法或构造函数的参数上使用@NonNull让lombok为您生成null-check语句。

如果lombok为您生成整个方法或构造函数(例如@Data),Lombok总是将字段上通常称为@NonNull的各种注释视为生成空值检查的信号。 但是现在,在参数上使用lombok自己的@lombok.NonNull会使得在您自己的方法或构造函数中只插入null-check语句。

null检查看起来像if (param == null) throw new NullPointerException("param is marked @NonNull but is null"); 并将此语句插入到方法的最顶层。 对于构造函数,将在任何显式this()或super()调用之后立即插入非空检查。

如果上层已经存在非空检查,则不会生成额外的非空检查。(这句话研究了半天也没想明白是啥意思,有知道的麻烦告知与我,感激!!)原文If a null-check is already present at the top, no additional null-check will be generated.

看代码示例

package com.amos.lombok;

import lombok.NonNull;

public class NonNullExample {

    private String name;

    // 在构造器上使用@NonNull
    public NonNullExample(@NonNull String name) {
        this.name = name;
    }

    // 在普通方法上使用@NonNull
    public static void example(@NonNull String str) {
        System.out.println(str);
    }

    public static void main(String[] args) {
        // 异常1
        NonNullExample example = new NonNullExample(null);
        // 异常2
        example(null);
    }
}

执行main方法后
异常1堆栈信息如下:

Exception in thread “main” java.lang.NullPointerException: name is marked @NonNull but is null

异常2堆栈信息如下:

Exception in thread “main” java.lang.NullPointerException: str is marked @NonNull but is null

上述代码编译后如下:

package com.amos.lombok;

import lombok.NonNull;

public class NonNullExample {
    private String name;

    public NonNullExample(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked @NonNull but is null");
        } else {
            this.name = name;
        }
    }

    public static void example(@NonNull String str) {
        if (str == null) {
            throw new NullPointerException("str is marked @NonNull but is null");
        } else {
            System.out.println(str);
        }
    }

    public static void main(String[] args) {
        example((String)null);
        new NonNullExample((String)null);
    }
}

猜你喜欢

转载自blog.csdn.net/amoscn/article/details/86543392