在方法参数中使用NotNull注释

问题描述 投票:110回答:6

我刚开始在Java 8中使用@NotNull批注,但得到了一些意想不到的结果。

我有这样的方法:

public List<Found> findStuff(@NotNull List<Searching> searchingList) {
    ... code here ...
}

我编写了一个JUnit测试,为参数searchList传递了空值。我原以为会发生某种类型的错误,但是好像没有注释就通过了。这是预期的行为吗?据我了解,这是允许您跳过编写样板为空的检查代码。

非常感谢@NotNull应该做什么的解释。

java
6个回答
137
投票

@Nullable@NotNull本身不执行任何操作。它们应该充当文档工具。

[@Nullable批注提醒您在以下情况下必须进行NPE检查:

  1. 可以返回空值的调用方法。
  2. 取消引用可以为空的变量(字段,局部变量,参数)。

[@NotNull注释实际上是一个声明以下内容的显式合同:

  1. 方法不应返回null。
  2. 变量(如字段,局部变量和参数)不能保存空值。

例如,代替写作:

/**
 * @param aX should not be null
 */
public void setX(final Object aX ) {
    // some code
}

您可以使用:

public void setX(@NotNull final Object aX ) {
    // some code
}

此外,@NotNull通常由ConstraintValidators检查(例如,在春季和冬眠期)。

@NotNull注释本身不会进行任何验证,因为annotation definition不提供任何ConstraintValidator类型引用。

有关更多信息,请参见:

  1. Bean validation
  2. NotNull.java
  3. Constraint.java
  4. ConstraintValidator.java

21
投票

如上所述,@NotNull本身不执行任何操作。使用@NotNull的一种好方法是将其与Objects.requireNonNull一起使用

Objects.requireNonNull

8
投票

要激活public class Foo { private final Bar bar; public Foo(@NotNull Bar bar) { this.bar = Objects.requireNonNull(bar, "bar must not be null"); } } ,您需要龙目岛:

@NotNull

https://projectlombok.org/features/NonNull

关注:import lombok.NonNull;


6
投票

SO @NotNull只是一个标签...如果要对其进行验证,则必须使用诸如休眠验证器jsr 303之类的东西>

Which @NotNull Java annotation should I use?

2
投票

如果使用的是Spring,则可以通过用ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); Validator validator = validatorFactory.getValidator(); Set<ConstraintViolation<List<Searching>> violations = validator.validate(searchingList); 注释类来强制验证:


0
投票

要在测试中测试方法的有效性,您必须将其包装为@Before方法中的代理。

© www.soinside.com 2019 - 2024. All rights reserved.