@NonNull注释是否允许默认构造函数赋予空值?

时间:2017-05-31 18:42:51

标签: java lombok

我有一个班级说C

class C {
  @NonNull
  private String str;
  //getters
  //setters
}

现在我做了类似的事情:

C ob = new C();
System.out.println(ob.getStr());

令我惊讶的是它打印了null。

然而,当我这样做时,它给出了Null指针异常:

ob.setStr(null)

@NonNull不能保留默认构造函数吗?请解释一下。

2 个答案:

答案 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();

会立即导致空指针异常。不是很有用。