我有一个班级说C
class C {
@NonNull
private String str;
//getters
//setters
}
现在我做了类似的事情:
C ob = new C();
System.out.println(ob.getStr());
令我惊讶的是它打印了null。
然而,当我这样做时,它给出了Null指针异常:
ob.setStr(null)
@NonNull
不能保留默认构造函数吗?请解释一下。
答案 0 :(得分:4)
@NonNull不能保留默认构造函数吗?
确实没有,它没有,我也看不出它是怎么回事。当编译器提供默认构造函数时,会在编译期间发生 注释处理。
此外,Lombok's own docs可以说这个注释用于字段:
Lombok始终将字段上名为
@NonNull
的任何注释视为 如果lombok生成整个方法,则生成空检查 的信号 或构造函数 ,例如@Data。然而,现在,使用 lombok在参数上拥有@lombok.NonNull
会导致插入 只有 你自己的 方法中的null-check语句或 构造
也就是说,注释仅对您自己的构造函数和方法(即源代码中存在的构造函数和方法)以及Lombok为您生成的构造有效。编译器提供的默认构造函数都不是。
答案 1 :(得分:0)
请阅读the documentation ...
Lombok始终将字段上名为@NonNull 的任何注释视为 如果lombok生成整个方法,则生成空检查信号 或构造函数,例如@Data。
您正在使用默认构造函数,因此Lombok不会为您生成构造函数,因此没有空检查。
如果它符合您的预期,那么您的类的每个默认构造对象都是:
C ob = new C();
会立即导致空指针异常。不是很有用。