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

@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.

看代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

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

上述代码编译后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

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

本章完!