398

我看到java中的一些方法声明为:

void foo(@Nullable Object obj)
{ ... }

这里有什么意义@Nullable?这是否意味着输入可能是null

没有注释,输入仍然可以为空,所以我猜这不仅仅是它?

4

4 回答 4

422

它清楚地表明该方法接受空值,并且如果您覆盖该方法,您也应该接受空值。

它还可以作为FindBugs等代码分析器的提示。例如,如果此类方法取消引用其参数而不首先检查 null,则 FindBugs 将发出警告。

于 2012-12-28T21:57:22.487 回答
91

此注解通常用于消除NullPointerExceptions. @Nullable说这个参数可能是null. 这种行为的一个很好的例子可以在Google Guice中找到。在这个轻量级的依赖注入框架中,你可以看出这个依赖可能是null. 如果您尝试在null没有注释的情况下通过,框架将拒绝完成它的工作。

更重要的是,@Nullable可能与@NotNull注释一起使用。在这里,您可以找到有关如何正确使用它们的一些提示。IntelliJ 中的代码检查检查注释并帮助调试代码。

于 2012-12-28T21:57:46.747 回答
18

不同的工具可能解释@Nullable不同的含义。例如,Checker FrameworkFindBugs的处理@Nullable 方式不同

于 2012-12-28T22:32:45.400 回答
5

诚然,肯定有不同的想法,在我的世界里,我不能强制执行“从不传递空值”,因为我正在与无法控制的第三方打交道,比如 API 调用者、数据库记录、前程序员等......所以我在方法上偏执和防御. 由于您使用的是 Java8 或更高版本,因此有一种比if块更简洁的方法。

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

您还可以通过切换.orElseorElseThrow(() -> new Exception("Dont' send a null")).

如果您不想使用 @Nullable,它不会在功能上添加任何内容,为什么不直接命名参数,mayBe...这样您的意图就很清楚了。

于 2020-03-28T17:12:09.800 回答