@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);
}
}